关于const对象和构造,析构函数
看 thinking in c++ 中文版,190页。 8.4.3 中间 书上说到: 一个没有被明确声明为const的成员函数被看成是将要修改对象中数据成员的函数,而且编一起不允许它为一个const对象调用
而且,看192页 第一句话,书上也明确说道,构造函数和析构函数都不是const成员函数。
这岂不是const对象不能调用构造析构函数? 这显然是不对的,我写了下面这个程序:
[code=C/C++][/code]
#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;
}
这个程序本身运行是没有错的,编译器(vs2010)没有任何问题。构造函数和析构函数也都调用了的。
可是我就不禁想问:
1、这个程序的顺利运行,岂不是和书上的文字解释相冲突? 虽然我之前也肯定的认为不管const对象与否,构造函数和析构函数都是应该被调用的。
2、还有一个问题,就如同我的程序里面注释的一样,如果去掉自己定义的构造析构函数,编译虽然能通过,但是会有警告。
警告内容如下:
1、 warning C4269: “a”: 用编译器生成的默认构造函数初始化的“const”自动数据产生不可靠的结果
2、 warning C4101: “a”: 未引用的局部变量
这又是怎么回事?
恳请大神点拨!!!
[解决办法]
1.构造函数,析构函数,拷贝构造函数以及赋值构造函数属于特殊的成员函数。是不能为const成员函数的。
A constructor can be invoked for a const,A constructor shall not be declared const, volatile, or const volatile
2.一个const 对象是需要被初始化的。而默认的构造函数未必能提供符合要求的初始化
[解决办法]
#include "stdafx.h"#include <iostream>using namespace std;class A{public: //A(); //有没有都正确,因为常对象a必须初始化,初始化之后才不能改。 ~A(); void fun() const; void fun2();};//A::A()//{// cout << "Hello!" << endl;//}A::~A(){ cout << "World!" << endl;}void A::fun() const{ cout << "this" << endl;}void A::fun2(){ cout << "NOT const" << endl;}int main(){ const A a; a.fun(); //fun() const; 展开原式是fun(const A * this, );但不能真的这样写 //a.fun2(); //这个是不行的!a不允许被修改,所以必须是常成员函数调用 return 1;}