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=0Point p2(3.0); // x=3.0, y=0.0Point 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++代码的基础。
以上就是C++构造函数类型 默认参数化拷贝移动的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1473305.html
微信扫一扫
支付宝扫一扫