码迷,mamicode.com
首页 > 其他好文 > 详细

一个空类被编译器编译后产生了哪些默认函数

时间:2015-04-01 11:31:49      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:c++   面试题   c   指针   编译器   

为何空类的大小不是0呢?

为了确保两个不同对象的地址不同,必须如此。
类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。

同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。

所以,空类的sizeof为1,而不是0.


一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,

如果你写 


class A{}; 

编译器处理后,就相当于: 

class A
{ 
public: 
    A();  //默认构造函数
    A(const A&);  //拷贝构造函数
    ~A();  //析构函数
    A& operator=(const A& rhs); 
    A* operator&();  //取地址运算符
    const A* operator&() const;
}; 


现在做如下说明:

看完上面的例子后,大家可能会觉得声明一个空类,大家都认为会生成     构造函数、拷贝构造函数、析构函数、赋值运算符号、取址运算符const、取址运算符。
其实不然啊,那么一个空类什么时候不是空类了呢?   其实对于这样的一个空类来说,是完全没有必要的,而编译器也不是这样做的。编译器的做法是:只有你需要用到这些函数并且你又没有显示的声明这些函数的时候,编译器才会贴心的自动声明相应的函数。  
  

class   A{};      
对于单独申明的一个空类A来说,编译器编译过程中,并没有发现创建A实例。   
所以对于空类A来说,编译器是不会给类A生成任何函数的。   
如果我们在代码中需要生成一个A的实例   
比如   
A   a;   
编译器就会根据上面的实例,给类A生成构造函数和析构函数。   
当使用   
A   b(b);   
编译器就会生成类A的拷贝构造函数。   
A   c;   
c   =   a;   

编译器生成赋值运算符函数   
A   &d   =   a;   
编译器生成取地址运算符函数。   
    
经过我们的分析可以这样理解:对于一个没有实例化的空类,编译器是不会给它生成任何函数的,当实例化一个空类后,编译器会根据需要生成相应的函数。这条理论同样适合非空类(只声明变量,而不声明函数)。

一个空类被编译器编译后产生了哪些默认函数

标签:c++   面试题   c   指针   编译器   

原文地址:http://blog.csdn.net/u014082714/article/details/44802327

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