C++类_构造函数
在 C++11 里,类的构造函数有多种类型,下面为你详细介绍各类构造函数并给出示例代码。
1. 默认构造函数
默认构造函数是没有参数的构造函数,要是没有为类定义任何构造函数,编译器会自动生成一个默认构造函数。
2. 带参数的构造函数
带参数的构造函数允许在创建对象时传入参数,以此初始化对象的成员变量。
3. 拷贝构造函数
拷贝构造函数用一个已存在的对象来初始化新对象,通常在对象按值传递或者返回时调用。
4. 移动构造函数(C++11 及以后)
移动构造函数用于高效地转移资源的所有权,避免不必要的拷贝操作,一般在对象被右值初始化时调用。
5. 委托构造函数
委托构造函数让一个构造函数可以调用同一个类的其他构造函数,从而减少代码重复。
6. 继承构造函数(C++11)
继承构造函数允许派生类直接使用基类的构造函数,而无需重新定义。
下面是包含上述各类构造函数的示例代码:
#include <iostream>
#include <utility>// 手动实现类似于 std::exchange 的功能
template<typename T, typename U = T>
T exchange(T& obj, U&& new_value) {T old_value = std::move(obj);obj = std::forward<U>(new_value);return old_value;
}// 基类
class Base {
public:// 默认构造函数Base() {std::cout << "Base: Default constructor" << std::endl;}// 带参数的构造函数Base(int value) : data(value) {std::cout << "Base: Parameterized constructor with value: " << data << std::endl;}// 拷贝构造函数Base(const Base& other) : data(other.data) {std::cout << "Base: Copy constructor" << std::endl;}// 移动构造函数Base(Base&& other) noexcept : data(exchange(other.data, 0)) {std::cout << "Base: Move constructor" << std::endl;}// 委托构造函数Base(int value1, int value2) : Base(value1 + value2) {std::cout << "Base: Delegating constructor" << std::endl;}private:int data;
};// 派生类
class Derived : public Base {
public:// 继承构造函数using Base::Base;// 派生类自己的构造函数Derived() {std::cout << "Derived: Default constructor" << std::endl;}
};int main() {// 默认构造函数Base base1;// 带参数的构造函数Base base2(10);// 拷贝构造函数Base base3(base2);// 移动构造函数Base base4(std::move(Base(20)));// 委托构造函数Base base5(30, 40);// 继承构造函数Derived derived1(50);// 派生类默认构造函数Derived derived2;return 0;
}
代码解释
- 默认构造函数:
Base()
无参数,用于创建默认初始化的对象。 - 带参数的构造函数:
Base(int value)
接收一个整数参数,用于初始化对象的成员变量。 - 拷贝构造函数:
Base(const Base& other)
用一个已存在的对象来初始化新对象。 - 移动构造函数:
Base(Base&& other) noexcept
转移资源的所有权,避免不必要的拷贝。 - 委托构造函数:
Base(int value1, int value2)
调用Base(int value)
来完成初始化。 - 继承构造函数:
using Base::Base;
让Derived
类可以使用Base
类的构造函数。
通过运行上述代码,你能看到各类构造函数的调用情况。