当前位置: 首页 > web >正文

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;
}

代码解释

  1. 默认构造函数Base() 无参数,用于创建默认初始化的对象。
  2. 带参数的构造函数Base(int value) 接收一个整数参数,用于初始化对象的成员变量。
  3. 拷贝构造函数Base(const Base& other) 用一个已存在的对象来初始化新对象。
  4. 移动构造函数Base(Base&& other) noexcept 转移资源的所有权,避免不必要的拷贝。
  5. 委托构造函数Base(int value1, int value2) 调用 Base(int value) 来完成初始化。
  6. 继承构造函数using Base::Base; 让 Derived 类可以使用 Base 类的构造函数。

    通过运行上述代码,你能看到各类构造函数的调用情况。

http://www.xdnf.cn/news/3723.html

相关文章:

  • DBSCAN对比K-means
  • 软件第三方测试报告:从测试背景目的到方法范围全解析?
  • 域名与官网的迷思:数字身份认证的全球困境与实践解方-优雅草卓伊凡
  • Java 网络安全新技术:构建面向未来的防御体系
  • 【三班网】初中最后一次研学活动纪实
  • 如何提升个人的理解能力?
  • 生成式 AI 的优势
  • 软件管理(安装方式)
  • 【关于LM311实现过零比较器输出波形】2022-9-27
  • 【自然语言处理与大模型】使用Xtuner进行模型合并与导出
  • NHANES指标推荐:triglyceride levels
  • MySQL安装完全指南:从零开始到配置优化(附避坑指南)
  • java_Lambda表达式
  • C++函数详解:从基础到高级应用
  • 二维码批量识别—混乱多张二维码识别-物品分拣—-未来之窗-仙盟创梦IDE
  • 生成式 AI 的阐释
  • 解决Maven项目中报错“java不支持版本6即更高的版本 7”
  • 使用python加edge-tts实现文字转语音
  • AI 采用金字塔(Sohn‘s AI Adoption Pyramid)
  • 《TensorFlow 与 TensorFlow Lite:协同驱动 AI 应用全景》
  • string的两种实现
  • 华为云Astro轻应用自定义连接器对接OBS云对象存储操作指南
  • No qualifying bean of type ‘XXX‘ available
  • AVInputFormat 再分析
  • 青少年ctf练习平台--做题wp(1)
  • 第九章:反击的序曲(续)
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 19)
  • IP伪装、代理池与分布式爬虫
  • 探索内容智能化的关键解决方案
  • java学习之数据结构:二、链表