最近在看《Thinking in C++》的第一卷。 因为之前还稍有基础,所以看的速度比看其他的书的速度要快一些 。 不过,这并不妨碍我找到我的疑惑。
在此书p190 8.4.3 中, 书上有写到 “一个没有被明确声明为const的成员函数被看成是将要修改对象中数据成员的函数,而且编译器不允许它为一个const对象所调用。”
这本来理所当然,但是,再向后看2页,192页的第一句话,书中又再一次明确指出“构造函数和析构函数都不是const成员函数”。我就突然想,那岂不是所有的const对象都不能初始化
和被清除? 抱着这一疑问,我简单的实验了一下
代码如下:
#include<iostream> using namespace std; class A{ public: int a;
A(){ //构造函数 a=1; cout <<"constructor is called !"<<endl;
} ~A() { //析构函数
a=0; cout<<"destroy..."<<endl; } }; int main() { { const A a; } system("pause"); return 0; }
通过这个程序,我一检测,果然,没有问题。我还心想,就是,怎么会弄错了呢! 如果常量对象不能调用构造函数和析构函数的话,那为何不直接禁止常量对象的定义呢?但是,我
又随便一试,却和之前有点不同。 在我把我自己定义的构造函数和析构函数去掉了以后,也就是我默认让编译器自动调用构造函数和析构函数的时候,编译器警报!
在main函数里面有 : warning C4269: “a”: 用编译器生成的默认构造函数初始化的“const”自动数据产生不可靠的结果
说明,编译器还是在提醒编程人员,这样做的危险性。
但是,说道底,我依然没有找出来为什么构造函数和析构函数不作为const成员函数,但是却依然允许常量对象调用,或许在理论上很好理解,因为毕竟所有的对象都应该调用自己
的构造函数来初始化自己。但是在字面上和“一个没有被明确声明为const的成员函数被看成是将要修改对象中数据成员的函数,而且编译器不允许它为一个const对象所调用。”
和这句话就会产生了冲突。或许我那里还没有理解透吧 ,待我查好资料,再来续写。
嗯,这里有了,原来在c++标准里面,有这么一句话:
A constructor can be invoked for a const,A constructor shall not be declared const, volatile, or const volatile 也就是说 构造函数,析构函数,拷贝构造函数以及赋值构造函数属于特殊的成员函数。是不能为const成员函数的。
至于警告的问题应该是 :一个const 对象是需要被初始化的。而默认的构造函数未必能提供符合要求的初始化
原文链接: https://www.cnblogs.com/Evan263/archive/2012/02/28/2372481.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/42798
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!