现在的位置: 首页 > 综合 > 正文

C++ FAQ学习笔记 18章 const正确性

2017年12月18日 ⁄ 综合 ⁄ 共 1015字 ⁄ 字号 评论关闭

[18.1] 什么是“const正确性”?

在这些函数中省去const,就是告诉编译器允许(但不强制)它们修改调用者的std::string对象。因此,这些g()函数可以把它们的std::string传递给任何f()函数,但只有f3()(通过传值接收参数)能够将其参数传递给g1()或g2()。如果f1()或f2()需要调用g()函数,必须给g()传递一份std::string的本地拷贝。f1()或f2()的参数不能直接传递给g()函数。

[18.2] “const正确性”是如何与普通的类型安全有何联系?

因为const变量缺少一些非const变量所具有的一些变更性操作

[18.4] “const Fred* p”是什么意思?

如果Fred类有一个非const成员函数mutate(),那么写p->mutate()就是个错误

[18.6] “const Fred& x”是什么意思?

意思是x是Fred对象的一个别名,但不能通过x来修改Fred对象。

[18.10] 什么是“const成员函数”?

另外一个对这种别名问题的(重要)认识是:用一根“指向const对象的指针”并不能保证对象不改变,它只是保证对象不会通过该指针被改变。

[18.11] 返回引用的成员函数和const成员函数之间有什么联系?

如果你通过引用返回的对象在逻辑上是this对象的一部分,而不管其是否在物理上放在了this 对象内,那么const方法应该返回const引用或直接按值返回

[18.12] “const重载”是做什么用的?

当一个查看函数和一个变更函数名字相同,且参数个数与类型也相同时就有用了——即两者的不同之处仅在于一个有const另一个没有const。下标运算符通常成对出现

[18.13] 如果我想让一个const成员函数对数据成员做“不可见”的修改,应该怎么办?

1.需要修改的数据成员应标记为mutable

2.如果编译器不支持mutable关键字,那么可以通过const_cast去除掉this的const, 但是最好该this对象本身定义时不是const对象

[18.15] 当我用const int*指向一个int后,为什么编译器还允许我修改这个int?

因为“const int* p”意思是“p保证不会修改*p”,而不是说“*p保证不变”。

[18.16] “const Fred* p”的意思是*p不会改变么?

同18.15

[18.17] 当把Foo**转换成const Foo**时为什么会出错?

抱歉!评论已关闭.