- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++中的指针(一)简单指针
A *pa;
有意点点另人混淆的是指针和 const 的混用。
char chr[] = abc ;
const char *p = chr; //这里 p 不是常数指针,而是把指针指向的地址
定义为了常数。无论chr本身是不是指向常数内存区,但只要用p 去操作,
那么就不行以通过 p 去修改其内容。
chr[2] = ’e’; // ok
p[2] = ’d’; // error
p+=1; // ok, 改的是p 指向的地址而不是 p 的内容。
真正的常数指针这么写
char *const cp = s;
这时在常数内存中 allocate 了一个指针的控件存储cp,cp,也就是这个
地址不能改,而其指向的内存的值可以修改。
chr[2] = ’w’; //ok
cp[2] = ’y’; // ok
cp+=1; // error
char* 可以被转换成 const char*,由于操作后没有负面影响。反过
来 const char* 不能转换成 char*,假如可以的话会把本部可写的内存的
数据改掉。
// g d example
char chr[] = “abc “;
char *p = chr;
const char *cp = p;
// bad example
char chr[] = “abc “;
const char *p = chr;
char *p = cp; // error.
这 种 转 换 常 用 在 函数 调 用 上 , 例 如 strcpy(char* source,
char*dest)。这个操作只是想修改 source,dest 只是用于参考。为了避
开函数修改 dest 可以把函数定义成 strcpy(char* source, const char*
dest)。
根本定义就这些了。对于指针的cast,C++作得比 C 更安全。例如有
两个完全不相干的 class A 和 B。
B b;
A *p1,*p2;
p1 = (A *)( // 这是 C 式的 cast,不管A 和 B 有什么关系,强型转
换。后果不堪设想。
C++ 中引入了 static_cast 操作,在肯定程度上爱护了操作的安全性,
static_cast 检查操作数与要操作的类型是否匹配,匹配是有class 继承
关系,无论谁继承谁都可以。假如这个关系不存在,出编译错误。
p2 = static_cast( //error。
但是这个检查是不完全的,
class C : public A {}
C* pc = static_cast(p1); // ok. 由于pc,p2 欧继承关系。
C++引入了 RTTI 得概念(Run Time Type Info)。通过 dynamic_cast
操作,可以检查操作数的内容,以确认这个操作是否胜利。检查内容的方
法就是把相关类型的继承关系和vtabl 都查一下。
p2 = dynamic_cast(p1);
在VC 下使用dynamic_cast别忘了在当前Project--Setting 下选Enabl
Run Time Type Info 。假如忘了选这个,debug 模式下编译会不通过,
releas 模式下会编译通过,运行时 Crash。
dynamic_cast 比拟简单,另外Visual C++各不同版本的表现不一样,
这里具体说一下我学到的和试出来的。一般书上说是三种不怜悯况,考虑
到Visual C++版本的问题,我分五个状况争论。
1。upcast。从派生类向基类的转换,只要基类的继承关系是的,就会胜
利 , 假 如 不 会 有 warning :“dynamic_cast used to convert to
inaccessible or ambiguous base; “
下下面的例子中
class A{public: virtual void a(){}};
class B : public A {};
class C : public B {};
class D : public B {};
class E : public C, public D {};
int main()
{
E e, *pe =
您可能关注的文档
最近下载
- 2025年从优秀村主干中考试录用乡镇街道机关公务员模拟试卷.docx VIP
- 微生物检验技士专业实践模拟试题1知识.doc VIP
- Unit 4 Seasons (说课稿)-2024-2025学年鲁科版五四制英语四年级上册.docx VIP
- 【工程文档】亮化工程技术交底.pdf VIP
- 客专联络线隧道临近既有线控制爆破施工专项方案116(分部控爆法 2013年).doc VIP
- 2025高考信息技术真题及答案2025.doc VIP
- 《自动化生产线安装与调试》课件——项目四 分拣站的安装与调试.pptx VIP
- 合同终止通知函8篇.docx VIP
- 华为公司人力资源管理纲要 总纲.docx VIP
- 川教版可爱的四川7至8年级 主题二 第5课《遍布四川的三国遗迹》 课件.pptx
原创力文档


文档评论(0)