C++空类默认生成哪些函数?

本文介绍C++中空类的概念及编译器自动生成的成员函数,包括默认构造函数、拷贝构造函数等,并解释了这些函数的生成条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义一个空的C++类,例如

class Empty
{
}

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

class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty& ); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};

一般的书上好像都是前面四种:默认构造函数,拷贝构造函数,默认赋值函数以及析构函数,后面两种其实属于,但要需要注意的是,只有当你需要用到这些函数的时候,编译器才会去定义它们。

如果你只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数、一个拷贝默认构造函数、一个默认拷贝赋值操作符和一个默认析构函数。这些函数只有在第一次被调用时,才会别编译器创建。所有这些函数都是inline和public的。

### C++默认移动构造函数的存在性 在C++11标准之后,如果类未声明任何复制控制成员函数(即构造函数、析构函数、赋值运算符),则编译器会自动提供一个隐式声明的移动构造函数[^3]。这意味着当满足一定条件时,默认情况下确实存在移动构造函数。 具体来说: - 编译器只为那些没有自己定义任何特殊成员函数(如拷贝构造函数、移动构造函数等)的类生成默认移动构造函数。 - 若已提供了自定义版本的拷贝操作或销毁行为,则不会为该类合成默认的移动语义功能。 - 对于内置类型以及POD(Plain Old Data)结构体/联合体类型的对象而言,其移动操作通常被优化成简单的位复制;而对于复杂的数据结构(比如含有动态分配资源的情况),即使是由编译器提供的默认实现也会遵循安全转移所有权的原则来执行真正的“移动”。 下面是一个简单例子展示如何利用默认移动构造函数: ```cpp #include <utility> #include <iostream> class MyClass { public: std::string* data; // 构造函数 MyClass(const char* str):data(new std::string(str)){} // 显式删除不必要的特例化方法以允许编译器生成默认移动构造函数 ~MyClass() { delete data; } }; int main(){ MyClass obj1("example"); // 使用右值作为源创建新对象触发默认移动构造函数 MyClass obj2(std::move(obj1)); return 0; } ``` 此程序片段展示了通过`std::move()`将临时对象转换为可移动状态从而激活默认移动构造函数的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值