C++构造函数类型 默认参数化拷贝移动

c++11支持默认、带参、拷贝和移动构造函数;默认构造函数可由编译器生成或显式声明,带参构造函数可含默认参数,拷贝构造用于对象复制,移动构造通过右值引用提升性能,合理使用可提升类的安全性与效率。

C++构造函数类型 默认参数化拷贝移动

在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++代码的基础。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享