类默认生成的成员函数

本文介绍了C++中类的默认成员函数,重点讨论了构造函数、拷贝构造函数和析构函数的作用和使用场景。构造函数用于对象初始化,包括默认构造函数、带参构造函数和用参数列表初始化数据成员的方式。拷贝构造函数用于复制已有对象,析构函数则在对象销毁前进行清理工作。此外,文章还提及了赋值运算符重载的重要性及其与拷贝构造函数的区别。
类默认生成的六个成员函数


一、构造函数
 我们知道,类的数据成员是不能在声明类的时候初始化的,因为类并不是一个实体,而是一种抽象的数据类型,并不占据存储空间。为了解决这个问题,C++提供了构造函数来处理对象的初始化。

1、构造函数的作用
  构造函数是一种特殊的成员函数,与其他成员函数不同,构造函数是在对象被实例化的时候自动被调用的,而且只执行这一次,它不能被用户调用。构造函数没有this指针。
  构造函数的名字是固定的,与类名相同,不能由用户任意命名,它没有类型,没有返回值
  构造函数的功能是由用户自己定义的,用户根据初始化的要求设计函数体和函数参数。
  如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,称作默认构造函数或者缺省构造函数。只是这个构造函数是空的,不执行任何操作,但还是会被调用。

例:设计一个日期类,并定义构造函数
classdate
{
public:
                date()             //构造函数
                {
                                _year = 0;     //初始化为0
                                _month = 0;
                                _day = 0;
                }
private:
                int _year;          //一般数据成员以_开头或者以m_开头
                int _month;
                int _day;
};



2、带参的构造函数
  有时候用户希望对不同的对象赋予不同的初始值,这时就必须用到带参的构造函数,实现不同
### C++ 编译器默认生成成员函数 在 C++ 中,如果没有显式定义某些成员函数,编译器会自动生成这些函数。以下是编译器默认生成成员函数型及其行为: #### 1. 默认构造函数中未定义任何构造函数时,编译器会生成一个默认构造函数。这个默认构造函数通常不会执行任何操作[^2]。例如: ```cpp class MyClass { int value; }; ``` 在这种情况下,`MyClass` 没有显式定义构造函数,因此编译器会生成一个默认构造函数 `MyClass()`,但它不会初始化成员变量 `value`,导致 `value` 可能包含随机值。 #### 2. 拷贝构造函数 如果中没有显式定义拷贝构造函数,编译器会生成一个默认的拷贝构造函数。该函数通过逐成员复制(member-wise copy)来创建对象的副本。例如: ```cpp class MyClass { int value; }; ``` 对于上述代码,编译器生成的拷贝构造函数等效于以下内容: ```cpp MyClass(const MyClass& other) : value(other.value) {} ``` 需要注意的是,如果中包含指针成员,则默认的拷贝构造函数可能导致浅拷贝问题[^3]。 #### 3. 拷贝赋值运算符 如果中没有显式定义拷贝赋值运算符,编译器会生成一个默认的拷贝赋值运算符。该运算符同样通过逐成员复制来实现赋值操作。例如: ```cpp MyClass& operator=(const MyClass& other) { if (this != &other) { value = other.value; } return *this; } ``` 与拷贝构造函数似,如果中包含指针成员,则默认的拷贝赋值运算符也可能导致浅拷贝问题[^3]。 #### 4. 析构函数 如果中没有显式定义析构函数,编译器会生成一个默认的析构函数。该析构函数通常不会执行任何操作,但会递归调用基和成员对象的析构函数。例如: ```cpp ~MyClass() {} ``` #### 5. 移动构造函数和移动赋值运算符 从 C++11 开始,编译器还会为生成默认的移动构造函数和移动赋值运算符,前提是中没有显式定义拷贝构造函数、拷贝赋值运算符、移动构造函数或移动赋值运算符[^1]。例如: ```cpp MyClass(MyClass&& other) noexcept : value(std::move(other.value)) {} MyClass& operator=(MyClass&& other) noexcept { if (this != &other) { value = std::move(other.value); } return *this; } ``` #### 特殊情况:阻止编译器生成默认成员函数 如果希望阻止编译器生成某些默认成员函数,可以使用 `= delete` 显式禁用它们。例如: ```cpp class MyClass { public: MyClass() = default; MyClass(const MyClass&) = delete; // 禁用拷贝构造函数 MyClass& operator=(const MyClass&) = delete; // 禁用拷贝赋值运算符 }; ``` ### 注意事项 - 如果中包含动态分配的资源(如指针),则需要显式定义析构函数以释放这些资源。 - 如果的对象之间存在赋值或初始化操作,则需要显式定义拷贝构造函数和拷贝赋值运算符以避免浅拷贝问题[^1]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值