C++中的空类,编译器默认可以产生哪些成员函数

在C++中,即使一个类未显式声明成员,编译器也会默认为其添加一些成员函数,如构造函数、析构函数等。本文详细解释了这些默认成员函数及其作用。

       一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 
class Empty{}; 
就相当于: 
class Empty 

    public: 
        Empty(); 
        Empty(const Empty&); 
        ~Empty(); 
        Empty& operator=(const Empty& rhs); 
        Empty* operator&(); 
        const Empty* operator&() const; 
}; 
需要注意的是只有当你需要用到这些函数的时候,编译器才会去定义它们。

     参考:侯捷--effective  c++
     条款45:   弄清C++在幕后为你所写、所调用的函数   
     一个空类什么时候不是空类?   
     ----   当C++编译器通过它的时候。如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。 



C++中,如果你定义一个**空类**(即没有显式定义任何成员函数或成员变量的类),编译器会自动为这个类生成一些**默认的特殊成员函数**,前提是这些函数没有被用户显式定义。这些函数包括: 1. 默认构造函数(Default Constructor) 2. 析构函数(Destructor) 3. 拷贝构造函数(Copy Constructor) 4. 拷贝赋值运算符(Copy Assignment Operator) 5. 移动构造函数(Move Constructor)(C++11 及以后) 6. 移动赋值运算符(Move Assignment Operator)(C++11 及以后) 这些函数是**合成的**(synthesized),也就是说,编译器会自动生成它们的实现。 --- ### 示例代码: ```cpp class Empty { // 用户没有定义任何构造函数、析构函数、赋值操作符等 }; ``` 对于上述空类 `Empty`,C++编译器默认提供如下函数(如果未被删除或显式定义): ```cpp Empty(); // 默认构造函数 ~Empty(); // 默认析构函数 Empty(const Empty&); // 拷贝构造函数 Empty& operator=(const Empty&); // 拷贝赋值运算符 Empty(Empty&&) noexcept; // 移动构造函数(C++11) Empty& operator=(Empty&&) noexcept; // 移动赋值运算符(C++11) ``` --- ### 各函数的作用: 1. **默认构造函数**:用于创建对象时调用,不做任何初始化。 2. **析构函数**:用于对象销毁时释放资源,不做任何操作。 3. **拷贝构造函数**:用于用一个已存在的对象初始化另一个新对象。 4. **拷贝赋值运算符**:用于将一个对象赋值给另一个已存在的对象。 5. **移动构造函数**:用于将临时对象的资源转移给新对象(C++11 引入)。 6. **移动赋值运算符**:用于将临时对象的资源转移到另一个已存在的对象(C++11 引入)。 --- ### 注意事项: - 如果你**显式声明了**这些函数中的任何一个(比如自定义了构造函数),编译器**不再自动生成**相应的默认版本。 - 如果类中含有 `const` 成员或引用成员,**默认拷贝赋值运算符会被删除**。 - 如果类的基类或成员对象没有可用的拷贝构造函数或拷贝赋值运算符,则相应的合成函数也会被删除。 --- ### 示例:显式删除某些函数 ```cpp class Empty { public: Empty() = default; // 显式使用默认构造函数 ~Empty() = default; // 显式使用默认析构函数 Empty(const Empty&) = delete; // 禁止拷贝构造 Empty& operator=(const Empty&) = delete; // 禁止拷贝赋值 }; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值