小工具知识网

当前位置: 首页 > 行业知识 > 【C++】构造函数、析构函数、拷贝构造与运算符重载

行业知识

【C++】构造函数、析构函数、拷贝构造与运算符重载

2026-11-06 07:18:26 来源:互联网转载

文章目录

  • 1.类的六个默认构造函数
  • 2.构造函数
    • 2.1特性
      • 2.1.1 函数名与类名相同
      • 2.1.2. 无返回值(不能写void)
      • 2.1.3. 对象实例化时编译器自动调用对应的构造函数
      • 2.1.4 构造函数可以重载
      • 2.1.5编译器生成默认的构造函数
      • 2.1.6编译器生成的默认构造有何用?
      • 2.1.7三种默认构造函数
      • 3.析构函数
        • 3.1特性
          • 3.1.1析构函数名是在类名前加上字符 ~
          • 3.1.2无参数无返回值类型(不能写void)
          • 3.1.3一个类只能有一个析构函数。
          • 3.1.4对象生命周期结束时,编译系统自动调用析构函数
          • 3.1.5编译器生成的默认析构函数
          • 4.拷贝构造
            • 4.1特征
              • 4.1.1拷贝构造函数是构造函数的一个重载形式
              • 4.1.2拷贝构造函数的参数
              • 4.1.3编译器生成默认的拷贝构造函数(浅拷贝)
              • 4.1.4拷贝构造函数典型调用场景:
              • 5.赋值运算符重载
                • 5.1运算符重载
                • 5.2赋值运算符重载
                  • 5.2.1赋值运算符重载格式
                  • 5.2.2返回值类型
                  • 5.2.3检测是否自己给自己赋值
                  • 5.2.4注意返回值
                  • 5.2.5重载成类的成员函数
                  • 5.2.6默认赋值运算符重载
                  • 5.3前置++与后置++重载
                  • 5.4运算符重载拓展
                  • 6.const成员函数
                  • 7.取地址及const取地址操作符重载

                    1.类的六个默认构造函数

                    如果一个类中什么成员都没有,简称为空类。

                    class test{};

                    空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

                    默认成员函数:用户没有显式实现,编译器自动生成的成员函数称为默认成员函数。

                    2.构造函数

                    class Data{public:void Init(int year = 1, int month = 1, int day = 1){this->_year = year;this->_month = month;this->_day = day;}void Print(){cout Data d1;d1.Init(2024, 5, 22);d1.Print();Data d2;d2.Init(2024, 5, 21);d2.Print();return 0;}public://构造Stack(size_t capacity = 3){this-_array = (DataType*)malloc(sizeof(DataType) * capacity);if (NULL == _array){perror("malloc申请空间失败!!!");return;}this-_capacity = capacity;this-_size = 0;}void Push(DataType data){// CheckCapacity();_array[_size] = data;_size++;}//析构~Stack(){ if (_array){free(_array);_array = NULL;_capacity = 0;_size = 0;}}private:DataType* _array;int _capacity;int _size;};int main(){Stack s;s.Push(1);s.Push(2);return 0;}public://构造函数Date(int year, int month, int day){this-_year = year;this-_month = month;this-_day = day;}//拷贝构造Date(const Date& d){this->_year = d._year;this->_month = d._month;this->_day = d._day;}private:int _year;int _month;int _day;};int main(){Date d1(2024,5,24);//拷贝构造//以下两种方式等价Date d2(d1);Date d3 = d1;return 0;}

                    4.1.2拷贝构造函数的参数

                    拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

                    为什么会引起无穷递归呢?

                    首先我们要知道,自定义类型传值传参要调用拷贝构造(可以看成一种规定)

                    下面的代码调试可以发现,当我们第一次按F11进入fun函数时,它是先进入到了Date类中的拷贝构造函数,第二次按F11才会进入fun函数。

                    如果这样,不写引用的话就会引发无穷的递归。

                    本来是只想调用拷贝构造,但是调用前要传参数,传递参数又要发生拷贝构造;那么还是要传递参数,此时就会形成没有尽头的递归,

                    4.1.3编译器生成默认的拷贝构造函数(浅拷贝)

                    若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

                    我们发现,对于所有成员确实都拷贝过去了,可是对于数组元素来说,它们两个数组的地址是相同的,也就是二者数组的同一块空间,这就有点不好了。

                    注意:

                    在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的;而自定义类型是调用其拷贝构造函数完成拷贝的。

                    4.1.4拷贝构造函数典型调用场景:

                    • 使用已存在对象创建新对象
                    • 函数参数类型为类类型对象
                    • 函数返回值类型为类类型对象
                      class Date { public:    Date(int year, int minute, int day)    {        cout         cout         cout     Date temp(d);    return temp; } int main() {    Date d1(2022,1,13);    Test(d1);    return 0; }if (d1._year 

上一篇:方舟服务器监狱怎么进入?

下一篇:网上怎么打开网银服务器?