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; }