C++ 构造函数

C++ 中,构造函数是一个特殊的成员函数,用于初始化对象。当创建一个对象时,构造函数自动被调用。构造函数的名称必须与类的名称相同,并且没有返回类型。构造函数可以被重载,以不同的初始化方式。构造函数的主要目的是初始化新创建的对象,确保其数据成员处于有效的初始状态。本文主要介绍C++ 构造函数。

1、构造函数

C++ 中的构造函数是一种特殊的方法,当创建类的对象时会自动调用该方法。

要创建构造函数,请使用与类相同的名称,后跟括号():

例如,

#include<iostream> 
using namespace std;

class MyClass {     // class
  public:           // 访问修饰符
    MyClass() {     // 构造函数
      cout << "Hello World!";
    }
};
int main() {
  MyClass myObj;    // 创建MyClass的一个对象(这将调用构造函数)
  return 0;
}

注意:构造函数与类具有相同的名称,始终为public,并且没有任何返回值。

2、构造函数参数

构造函数还可以接受参数(就像常规函数一样),这对于设置属性的初始值很有用。

例如,

#include<iostream> 
using namespace std;

class Person {        // class
  public:          // 访问修饰符
    string Name;  
    string Birthday;  
    int Age;      
    Person(string x, string y, int z) { // Constructor with parameters
      Name = x;
      Birthday = y;
      Age = z;
    }
};
int main() {
  Person obj1("C", "1999-01-01", 1999);
  Person obj2("C++", "1999-01-01", 1969);
  // Print values
  cout << obj1.Name << " " << obj1.Birthday << " " << obj1.Age << "\n";
  cout << obj2.Name << " " << obj2.Birthday << " " << obj2.Age << "\n";
  return 0;
}

就像函数一样,构造函数也可以在类之外定义。首先,在类的内部声明构造函数,然后在类的外部定义它,指定类的名称,后跟作用域解析符::,再后跟构造函数的名称(与类相同):

例如,

#include<iostream> 
using namespace std;

class Person {        // class
  public:          // 访问修饰符
    string Name;  
    string Birthday;  
    int Age;      
    Person(string x, string y, int z);
};
// 类外的构造函数定义
Person::Person(string x, string y, int z) {
  Name = x;
  Birthday = y;
  Age = z;
}
int main() {
  Person obj1("C", "1999-01-01", 1999);
  Person obj2("C++", "1999-01-01", 1969);
  // Print values
  cout << obj1.Name << " " << obj1.Birthday << " " << obj1.Age << "\n";
  cout << obj2.Name << " " << obj2.Birthday << " " << obj2.Age << "\n";
  return 0;
}

3、构造函数类型

C++ 构造函数是对象初始化的重要机制,不同的构造函数类型适用于不同的场景。选择合适的构造函数可以提高代码的效率和安全性。

1)默认构造函数 (Default Constructor)

默认构造函数是没有参数的构造函数,用于在没有提供初始化值时,初始化类的成员变量。即使你没有显式定义一个默认构造函数,编译器会根据需要提供一个自动生成的默认构造函数。

#include<iostream>
using namespace std;

class MyClass {
public:
    MyClass() {
        // 默认构造函数
        x = 0;
    }

private:
    int x;
};

int main() {
  cout << "Hello, World!";
  return 0;
}

2)带参数的构造函数 (Parameterized Constructor)

带参数的构造函数是接受一个或多个参数,用于在创建对象时指定初始值。可以根据需要重载多个带不同参数的构造函数。

#include<iostream>
using namespace std;

class MyClass {
public:
    MyClass(int a, int b) {
        x = a;
        y = b;
    }

private:
    int x, y;
};

int main() {
  cout << "Hello, World!";
  return 0;
}

3)拷贝构造函数 (Copy Constructor)

拷贝构造函数用于创建一个新对象,并将已有对象的值拷贝到新对象中。拷贝构造函数的参数通常是类的常量引用(const)。

#include<iostream>
using namespace std;

class MyClass {
public:
    MyClass(int a, int b) : x(a), y(b) {}

    // 拷贝构造函数
    MyClass(const MyClass &other) {
        x = other.x;
        y = other.y;
    }

private:
    int x, y;
};


int main() {
  cout << "Hello, World!";
  return 0;
}

4)移动构造函数 (Move Constructor)

C++11 引入了移动语义。移动构造函数用于将一个临时对象的资源从源对象“转移”到目标对象,而不是进行深拷贝。移动构造函数的参数通常是类的右值引用。

#include<iostream>
using namespace std;

class MyClass {
public:
    MyClass(int a, int b) : x(a), y(b) {}

    // 移动构造函数
    MyClass(MyClass &&other) noexcept {
        x = other.x;
        y = other.y;

        // 可以将 other 对象置为空,避免资源泄漏
        other.x = 0;
        other.y = 0;
    }

private:
    int x, y;
};

int main() {
  cout << "Hello, World!";
  return 0;
}

推荐阅读
cjavapy编程之路首页