首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于const对象和构造,析构函数,该如何处理

2012-03-29 
关于const对象和构造,析构函数看 thinking in c++ 中文版,190页。 8.4.3 中间 书上说到: 一个没有被明确声

关于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 对象是需要被初始化的。而默认的构造函数未必能提供符合要求的初始化
[解决办法]

C/C++ code
#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;} 

热点排行