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

本文介绍了C++中空类默认生成的成员函数,包括构造函数、析构函数、拷贝构造函数等,并解释了这些函数如何在需要时由编译器生成。此外,还探讨了自定义拷贝构造函数对默认构造函数的影响。

C++中创建一个空类:
class Empty {};
默认会生成4个函数,其函数的原型如下:

public: Empty() { ... }

Empty(const Empty& rhs) { ... }

~Empty() { ... }

Empty& operator=(const Empty& rhs) { ... }

说明:1) 这些函数只有在需要调用的时候,编译器才会生成。

2) 4个函数都是public的。

3) 4个函数都是inline的(即函数定义在类的定义中的函数)。

4) 如果你显式的声明了这些函数中的任何一个函数,那么编译器将不再生成默认的函数。

比如,当遇到下列语句时,函数会被编译器生成:

Empty e1; //默认构造函数

//对象销毁时,析构函数Empty e2(e1); //

拷贝构造函数e2 = e1; //赋值运算符

另外,还存在两种默认的函数:就是取地址运算符和取地址运算符的const版本,这两个函数在《Effective C++》中没有提及。

public: Empty* operator&() { ... }

const Empty* operator&() const { ... }

这两个函数是确实存在的,正如下面的代码可以正常工作:

#include <stdio.h>class Empty {};

int main(int argc, char** argv)

{ Empty a;

const Empty *b = &a; printf("%p/n", &a); //调用取地址运算符

printf("%p/n", b); //调用const取地址运算符}

一个容易被忽略的问题:自定义的拷贝构造函数不仅会覆盖默认的拷贝构造函数,也会覆盖默认的构造函数。下面的代码是编译不过的,用户必须再显式的定义一个无参的构造函数。

class Empty {

public: Empty(const Empty& e) { }

//拷贝构造函数};

int main(int argc, char** argv){ Empty a;}

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; // 禁止拷贝赋值 }; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值