c++11支持默认、带参、拷贝和移动构造函数;默认构造函数可由编译器生成或显式声明,带参构造函数可含默认参数,拷贝构造用于对象复制,移动构造通过右值引用提升性能,合理使用可提升类的安全性与效率。
在C++中,构造函数是类的重要组成部分,负责对象的初始化。现代C++(C++11及以后)为类提供了多种构造函数类型,包括默认构造函数、带参数的构造函数、拷贝构造函数和移动构造函数。同时,构造函数可以使用默认参数,提升灵活性。下面详细介绍这些构造函数类型及其使用方式。
默认构造函数
默认构造函数是在不提供任何参数的情况下调用的构造函数。
如果类中没有定义任何构造函数,编译器会自动生成一个默认构造函数。但一旦定义了其他构造函数,编译器通常不再生成默认的,除非显式要求。
示例:
class MyClass { public: MyClass() { /* 初始化 */ } }; MyClass obj; // 调用默认构造函数
使用 = default 可强制编译器生成默认构造函数:
立即学习“C++免费学习笔记(深入)”;
MyClass() = default;
带参数的构造函数(含默认参数)
构造函数可以接受参数,用于初始化成员变量。参数可以设置默认值,使调用更灵活。
示例:
class Point { double x, y; public: Point(double x = 0.0, double y = 0.0) : x(x), y(y) {} }; Point p1; // 使用默认参数,x=0, y=0 Point p2(3.0); // x=3.0, y=0.0 Point p3(2, 4); // x=2, y=4
注意:一旦构造函数有默认参数,就可能与默认构造函数产生调用歧义,需谨慎设计。
拷贝构造函数
拷贝构造函数用于用同类的另一个对象初始化新对象。
如果未定义,编译器会自动生成一个逐成员拷贝的版本(浅拷贝)。
示例:
class Buffer { char* data; size_t size; public: Buffer(const Buffer& other) : size(other.size), data(new char[other.size]) { std::copy(other.data, other.data + size, data); } }; Buffer b1; Buffer b2 = b1; // 调用拷贝构造函数
推荐使用 const 引用 避免不必要的拷贝并防止修改原对象。
移动构造函数
移动构造函数(C++11引入)用于“窃取”临时对象的资源,避免不必要的深拷贝,提升性能。
参数是右值引用(&&)。
示例:
class Buffer { public: Buffer(Buffer&& other) noexcept : data(other.data), size(other.size) { other.data = nullptr; // 防止资源被释放两次 other.size = 0; } }; Buffer createBuffer() { return Buffer(1024); } Buffer b = createBuffer(); // 调用移动构造函数
移动操作应标记为 noexcept,以便标准库在重分配时能安全使用。
基本上就这些。合理定义这几种构造函数,能让你的C++类更安全、高效、易用。默认参数增加调用灵活性,拷贝和移动语义则决定资源管理行为。理解它们的触发条件和默认生成规则,是写出高质量C++代码的基础。