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