码迷,mamicode.com
首页 > 编程语言 > 详细

C++中的const对象与缺省构造函数问题

时间:2015-07-26 16:56:48      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

先看一个“奇怪”的错误:
#include <iostream>
#include <stdlib.h>
using namespace std;
class A{
private:
 int sad;
 
public:
   void f() const;               
   void f1();
   //A(int);
   //A();
};
void A::f() const{
cout<<"dfsdfds";     
 
}  
void A::f1(){
cout<<"f1";      
}
//A::A(int sr){
//}
//A::A(){}
 
int main(int argc, char *argv[])
{
 const A caa;
 caa.f();
 system("PAUSE");
 return 0;
}
  当使用缺省构造函数时,“const A a ;”会报错。
  但当把构造函数写出来后,就没问题了。
  为什么?
  好了,为了说明这个问题,先引用两句话:
  “const对象必须保证对象的数据成员在其生命期内不被改变”(c++编程思想第二版 第一卷 190页)
  “缺省构造函数不做任何初始化工作”(钱能第一版 276页)
   既然终生不能改变,那么不在const对象创建的时候初始化又能在什么时候初始化呢?所以只能在const对象创建时进行对象的数据成员的初始化。
   但缺省构造函数却不做任何初始化! const对象要求必须在创建时初始化,而缺省构造函数却无法完成这一功能,那么怎么办呢?
   只好借助于用户自定义构造函数!而且在这个自定义的构造函数中,必须初始化数据成员,否则不是“沦落”到缺省构造函数的水平了吗?!
   现在再看咱们的程序。
   当用户没有定义构造函数时,“const A a ;” a这个对象被创建时调用缺省构造函数,但因为是const型的,不能用缺省构造函数,所以会报错。
   当用户定义了构造函数 “A::A(){}” 时,虽然它没有(实际上应该)初始化数据成员,但编译器(实际是编译器的设计者)以为它一定会在用户自定义构造函数中初始化数据成员(因为     不做这种定义的话,还不如直接用缺省构造函数省事呢,又何必多次一举!),所以编译器一看到有用户自定义的构造函数,就认为它会初始化数据成员,就给它放了行!
   它骗过了编译器!
   此种情况下编译虽能通过,但却是极其不可取的。我们不应该玩这种欺骗编译器的把戏,编译器是我们的朋友啊。
转载自:http://blog.sina.com.cn/s/blog_3c6889fe0100taud.html

 

C++中的const对象与缺省构造函数问题

标签:

原文地址:http://www.cnblogs.com/leijiangtao/p/4677845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!