const对象和成员函数

最近在看《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】免费获取数百本计算机经典书籍

    const对象和成员函数

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/42798

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午7:32
下一篇 2023年2月8日 下午7:33

相关推荐