类和对象(中)

1.类的默认成员函数

   在C++中,类的默认成员函数包括以下几种:

  1. 默认构造函数(Default Constructor):如果类中没有定义任何构造函数,编译器会自动提供一个默认构造函数,允许对象被创建而不需要提供任何参数。如果类定义了其他构造函数,编译器不会再提供这个默认构造函数。

    class MyClass {  
    public:  
        int a;  
        // 默认构造函数会被自动生成  
    };  
    
    MyClass obj; // 使用默认构造函数

  2. 复制构造函数(Copy Constructor):如果类中没有定义复制构造函数,编译器会自动提供一个默认的复制构造函数,进行逐成员复制。

    class MyClass {  
    public:  
        int a;  
        // 默认复制构造函数会被自动生成  
    };  
    
    MyClass obj1;  
    MyClass obj2 = obj1; // 使用默认复制构造函数

  3. 析构函数(Destructor):如果类中没有定义析构函数,编译器会自动提供一个默认的析构函数。它不会执行任何特殊的清理操作,通常只是释放对象的内存。

    class MyClass {  
    public:  
        int a;  
        // 默认析构函数会被自动生成  
    };  
    
    // MyClass对象超出作用域时自动调用析构函数

  4. 移动构造函数(Move Constructor):从C++11开始,如果类中没有定义移动构造函数,编译器会生成一个默认的移动构造函数,将其成员逐个移动。

  5. 移动赋值运算符(Move Assignment Operator):同样地,如果类中没有定义移动赋值运算符,编译器也会提供一个默认的移动赋值运算符。

默认构造函数、复制构造函数和析构函数在没有自定义时由编译器自动生成。C++11引入的移动构造函数和移动赋值运算符也会在缺省情况下由编译器提供。若定义了任何一个特殊成员函数,编译器将不会创建其他的默认成员函数。使用= default可以显式要求编译器生成默认实现。

2.构造函数

C++中的构造函数是一种特殊的成员函数,用于初始化对象。当对象被创建时,构造函数会被自动调用。构造函数的名称与类名相同,并且没有返回值(也没有返回类型)。构造函数可以有参数,也可以是无参数的(默认构造函数)。

构造函数的类型

  1. 默认构造函数

    • 无参数的构造函数,用于初始化对象时不需要提供任何参数。
    • 如果类没有定义构造函数,编译器会自动生成一个默认构造函数。
      class MyClass {  
      public:  
          int a;  
          MyClass() { // 默认构造函数  
              a = 0;  
          }  
      };  
      
      MyClass obj; // 创建对象时调用默认构造函数

  2. 带参数的构造函数

    可以接受一个或多个参数,以便在创建对象时使用特定的值进行初始化。
    class MyClass {  
    public:  
        int a;  
        MyClass(int value) { // 带参数的构造函数  
            a = value;  
        }  
    };  
    
    MyClass obj(10); // 创建对象时调用带参数的构造函数
    • 复制构造函数:用于通过复制现有对象来创建新对象。复制构造函数通常有一个参数,该参数是同类型的对象的引用。

      class MyClass {  
      public:  
          int a;  
          MyClass(int value) : a(value) {} // 带参数构造函数  
          MyClass(const MyClass &obj) { // 复制构造函数  
              a = obj.a;  
          }  
      };  
      
      MyClass obj1(10);  
      MyClass obj2 = obj1; // 调用复制构造函数

      移动构造函数(C++11及以后):

    • 用于通过移动现有对象来创建新对象,通常在对资源进行优化(例如动态内存分配)时使用。移动构造函数接受一个右值引用作为参数
    • class MyClass {  
      public:  
          int *data;  
          MyClass(int value) {  
              data = new int(value);  
          }  
          MyClass(MyClass &&obj) { // 移动构造函数  
              data = obj.data; // 转移所有权  
              obj.data = nullptr; // 将源对象的指针置为nullptr  
          }  
          ~MyClass() {  
              delete data; // 释放动态内存  
          }  
      };  
      
      MyClass obj1(10);  
      MyClass obj2 = std::move(obj1); // 调用移动构造函数

    • 如果类中定义了任何构造函数,编译器将不再提供自动的默认构造函数。
    • 构造函数可以使用初始化列表进行成员初始化,这通常更高效,特别是在成员是常量或引用时。
      class MyClass {  
      public:  
          const int value;  
          MyClass(int val) : value(val) {} // 使用初始化列表  
      };

    • 当类包含动态分配的资源(如指针)时,确保在析构函数中释放这些资源,以避免内存泄漏。
    • 复制构造函数和赋值运算符需要谨慎处理,以避免浅拷贝导致的问题。使用“遵循规则三”或“规则五”来管理资源。
      • 目录

        构造函数的类型


        默认构造函数

      • 带参数的构造函数

      • 移动构造函数(C++11及以后)

你可能感兴趣的:(开发语言,c++,数据结构)