c中的所有构造函数的方法
目录
c++中的所有构造函数的方法
在 C++ 中,构造函数(Constructor)是一种特殊的成员函数,用于初始化对象。构造函数在创建对象时自动调用,且名称必须与类名相同。以下是 C++ 中所有常见的构造函数类型及其实现方法:
1. 默认构造函数(Default Constructor)
默认构造函数是没有参数的构造函数。如果用户没有定义任何构造函数,编译器会自动生成一个默认构造函数。
语法:
ClassName() {
// 初始化代码
}
示例:
class MyClass {
public:
MyClass() {
cout << "Default Constructor Called!" << endl;
}
};
int main() {
MyClass obj; // 调用默认构造函数
return 0;
}
2. 参数化构造函数(Parameterized Constructor)
参数化构造函数接受一个或多个参数,用于初始化对象的成员变量。
语法:
ClassName(parameters) {
// 初始化代码
}
示例:
class MyClass {
public:
int value;
MyClass(int v) {
value = v;
cout << "Parameterized Constructor Called! Value: " << value << endl;
}
};
int main() {
MyClass obj(10); // 调用参数化构造函数
return 0;
}
3. 拷贝构造函数(Copy Constructor)
拷贝构造函数用于通过另一个同类型的对象初始化新对象。它通常以引用方式接受一个同类型的对象作为参数。
语法:
ClassName(const ClassName& other) {
// 拷贝初始化代码
}
示例:
class MyClass {
public:
int value;
MyClass(int v) : value(v) {} // 参数化构造函数
MyClass(const MyClass& other) {
value = other.value;
cout << "Copy Constructor Called! Value: " << value << endl;
}
};
int main() {
MyClass obj1(10); // 调用参数化构造函数
MyClass obj2 = obj1; // 调用拷贝构造函数
return 0;
}
4. 移动构造函数(Move Constructor)
移动构造函数用于通过“移动”另一个对象的资源来初始化新对象。它通常以右值引用方式接受一个同类型的对象作为参数。
语法:
ClassName(ClassName&& other) {
// 移动资源代码
}
示例:
class MyClass {
public:
int* data;
MyClass(int size) {
data = new int[size];
cout << "Parameterized Constructor Called!" << endl;
}
MyClass(MyClass&& other) noexcept {
data = other.data; // 移动资源
other.data = nullptr; // 置空原对象的指针
cout << "Move Constructor Called!" << endl;
}
~MyClass() {
delete[] data;
}
};
int main() {
MyClass obj1(10); // 调用参数化构造函数
MyClass obj2 = std::move(obj1); // 调用移动构造函数
return 0;
}
5. 委托构造函数(Delegating Constructor)
委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,以避免代码重复。
语法:
ClassName() : ClassName(default_value) {
// 委托构造函数
}
示例:
class MyClass {
public:
int value;
MyClass() : MyClass(0) { // 委托构造函数
cout << "Delegating Constructor Called!" << endl;
}
MyClass(int v) : value(v) { // 参数化构造函数
cout << "Parameterized Constructor Called! Value: " << value << endl;
}
};
int main() {
MyClass obj; // 调用委托构造函数
return 0;
}
6. 继承中的构造函数(Constructor in Inheritance)
在继承中,派生类的构造函数可以调用基类的构造函数来初始化基类部分。
语法:
DerivedClass() : BaseClass() {
// 派生类初始化代码
}
示例:
class Base {
public:
Base() {
cout << "Base Constructor Called!" << endl;
}
};
class Derived : public Base {
public:
Derived() {
cout << "Derived Constructor Called!" << endl;
}
};
int main() {
Derived obj; // 先调用基类构造函数,再调用派生类构造函数
return 0;
}
7. 初始化列表构造函数(Constructor with Initializer List)
初始化列表构造函数用于在构造函数中直接初始化成员变量,而不是在构造函数体内赋值。
语法:
ClassName() : member1(value1), member2(value2) {
// 构造函数体
}
示例:
class MyClass {
public:
int a, b;
MyClass(int x, int y) : a(x), b(y) { // 使用初始化列表
cout << "Initializer List Constructor Called! a: " << a << ", b: " << b << endl;
}
};
int main() {
MyClass obj(10, 20); // 调用初始化列表构造函数
return 0;
}
8. 显式构造函数(Explicit Constructor)
显式构造函数用于防止隐式类型转换。通过
explicit
关键字修饰的构造函数只能显式调用。
语法:
explicit ClassName(parameters) {
// 初始化代码
}
示例:
class MyClass {
public:
int value;
explicit MyClass(int v) : value(v) {
cout << "Explicit Constructor Called! Value: " << value << endl;
}
};
int main() {
// MyClass obj = 10; // 错误:不能隐式转换
MyClass obj(10); // 正确:显式调用构造函数
return 0;
}
总结
构造函数类型 | 特点 |
---|---|
默认构造函数 | 无参数,用于默认初始化 |
参数化构造函数 | 带参数,用于初始化成员变量 |
拷贝构造函数 | 通过同类型对象初始化新对象 |
移动构造函数 | 通过“移动”资源初始化新对象 |
委托构造函数 | 调用同一个类中的其他构造函数 |
继承中的构造函数 | 派生类调用基类构造函数 |
初始化列表构造函数 | 使用初始化列表直接初始化成员变量 |
显式构造函数 | 防止隐式类型转换 |