C++构造函数详解:从基础到高级

article/2025/8/4 12:34:03

在这里插入图片描述

文章目录

  • 1. 摘要
  • 2. 默认构造函数
  • 3. 无参构造函数
  • 4. 带参构造函数
  • 5. 拷贝构造函数
  • 6. 移动构造函数 (C++11)
  • 7. 委托构造函数 (C++11)
  • 8. 转换构造函数
  • 9. 默认拷贝构造函数
  • 10. 总结


1. 摘要

构造函数是C++类的重要组成部分,负责对象的初始化工作。本文将详细讲解8种构造函数的特点和使用场景,并附有简洁易懂的代码示例。


2. 默认构造函数

​​特点​​:没有参数的构造函数
​​使用场景​​:当没有显式定义任何构造函数时,编译器会自动生成

class Person {
public:// 编译器自动生成的默认构造函数// 初始化成员变量为默认值std::string name;int age;
};int main() {Person p; // 调用默认构造函数return 0;
}

3. 无参构造函数

​​特点​​:显式定义的不带参数的构造函数
​​使用场景​​:需要自定义对象初始化逻辑,但不需要参数时

class Person {
public:std::string name;int age;// 显式定义无参构造函数Person() : name("Unknown"), age(0) {} // 初始化成员变量
};int main() {Person p; // 调用显式定义的无参构造函数return 0;
}

4. 带参构造函数

​特点​​:带有参数的构造函数
​​使用场景​​:需要通过参数自定义对象初始化

class Person {
public:std::string name;int age;// 带参构造函数Person(std::string n, int a) : name(n), age(a) {}
};int main() {Person p("Alice", 30); // 调用带参构造函数return 0;
}

5. 拷贝构造函数

​​特点​​:用同类型对象初始化新对象
​使用场景​​:对象按值传递、对象返回、显式拷贝初始化

class Person {
public:std::string name;int age;// 拷贝构造函数Person(const Person& other) : name(other.name), age(other.age) {}
};int main() {Person p1("Bob", 25);Person p2 = p1; // 调用拷贝构造函数return 0;
}

6. 移动构造函数 (C++11)

​​特点​​:通过右值引用(&&)转移资源所有权
​​使用场景​​:优化临时对象的资源转移,避免深拷贝

#include <utility> // 包含std::moveclass Data {
public:int* buffer;// 移动构造函数Data(Data&& other) noexcept : buffer(other.buffer) {other.buffer = nullptr; // 置空原对象指针}
};int main() {Data d1;Data d2 = std::move(d1); // 调用移动构造函数return 0;
}

7. 委托构造函数 (C++11)

​​特点​​:在一个构造函数中调用同类其他构造函数
​​使用场景​​:减少代码重复,简化对象初始化流程

class Rectangle {
public:int width, height;// 基础构造函数Rectangle(int w, int h) : width(w), height(h) {}// 委托构造函数:委托给基础构造函数Rectangle() : Rectangle(1, 1) {} // 默认初始化为1x1Rectangle(int size) : Rectangle(size, size) {} // 初始化为正方形
};int main() {Rectangle r1;       // 调用Rectangle()Rectangle r2(5);    // 调用Rectangle(int)Rectangle r3(3, 4); // 直接调用基础构造函数return 0;
}

8. 转换构造函数

​​特点​​:接受单个参数的构造函数,支持隐式类型转换
​​使用场景​​:需要不同类型之间的隐式转换时

class Celsius {
public:double temperature;// 转换构造函数:允许从double隐式转换为CelsiusCelsius(double t) : temperature(t) {}
};int main() {Celsius c = 25.5; // 隐式调用转换构造函数return 0;
}// 若要禁止隐式转换,需添加explicit关键字:
// explicit Celsius(double t) : temperature(t) {}

9. 默认拷贝构造函数

​​特点​​:编译器自动生成的拷贝构造函数,执行逐成员浅拷贝
​​使用场景​​:对象不包含动态资源时,默认拷贝即可满足需求

class Point {
public:int x, y;// 编译器自动生成默认拷贝构造函数
};int main() {Point p1{2, 3};Point p2 = p1; // 调用默认拷贝构造函数return 0;
}

10. 总结

构造函数类型触发时机核心作用
默认构造函数无参数对象创建时提供默认初始化
无参构造函数显式调用无参构造自定义无参初始化逻辑
带参构造函数使用参数创建对象时自定义带参数初始化
拷贝构造函数对象拷贝初始化时深/浅拷贝控制
移动构造函数右值对象初始化时资源所有权转移
委托构造函数同类构造函数互相调用减少代码重复
转换构造函数隐式类型转换时实现类型转换逻辑
默认拷贝构造函数未自定义拷贝构造时执行逐成员浅拷贝

最佳实践​​:

  1. 需要深拷贝时务必自定义拷贝构造函数
  2. 管理动态资源时应同时实现拷贝构造函数和移动构造函数
  3. 使用explicit关键字防止意外隐式转换
  4. 利用委托构造函数简化复杂初始化逻辑

通过合理使用不同类型的构造函数,可以显著提升代码的效率和可维护性。


http://www.hkcw.cn/article/gosXUbSysw.shtml

相关文章

day16 leetcode-hot100-32(链表11)

138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 1.哈希表 思路 第一次遍历创建新节点并将原节点与新节点同时放入哈希表中 第二次遍历为新节点加入next与random 具体代码 /* // Definition for a Node. class Node {int val;Node next;Node random;public N…

52. N-Queens II

题目描述 52. N-Queens II 回溯法 这道题与第51题是一样的。51. N-Queens-CSDN博客 class Solution {int columns; //从低位到高位起算&#xff0c;第i位为0表示棋盘第i列可以放置皇后&#xff0c;第i位为1表示棋盘第i列不能放置皇后//边长为n的棋盘分别有2n-1条正斜线和反…

关于adb devices无法找到设备:error: device not found 的解决办法

一、此类问题出现的原因&#xff0c;一般是设备所使用的端口被占用&#xff0c;需要找到被占用的端口。 二、操作步骤 1、打开命令窗口。 2、输入adb shell 会发现提示error:device not found&#xff01; 3、输入adb kill-server ,然后启动adb start-server 4、输入 net…

关于不同平台微信多开的解决方案(WIN/MAC/IOS/Andriod)

日常生活跟工作中需要用到多开微信&#xff0c;本次分享下在不同平台上解决微信多开的方法。这些方法我都用了超过1年以上&#xff0c;都比较稳定。中间遇到的一些问题我也有说明&#xff0c;包括每个方法的优缺点&#xff0c;每个平台的操作等。 先说下我自己体验下来的结论&a…

Flutter项目兼容鸿蒙Next系统

一、环境搭建&#xff1a; 1.1 下载鸿蒙DevEco Studio开发工具。 下载地址&#xff1a;下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 下载之前需要先登录&#xff0c;后面的模拟器创建还要开发者验证、审核啥的&#xff0c;好在审核进度还可以&am…

无需密码强制移除Apple ID 工具! iOS 11.3以下可用 ipad和iphone通用!还不快快收藏起来

无需密码强制移除Apple ID 工具&#xff01; iOS 11.3以下可用 ipad和iphone通用&#xff01;还不快快收藏起来 ✅ 支持的设备范围注意事项使用方法如何下载&#xff1f; 很多朋友在不再使用某个Apple 帐户或是转卖旧的iPhone&#xff0c;为了防止 ID 被盗导致个人信息泄露&…

Mac 散热救星:Macs Fan Control,让你的苹果电脑“冷静”又安静!

各位果粉们&#xff0c;是不是经常遇到这样的烦恼&#xff1a;用着用着电脑&#xff0c;突然就发热卡顿&#xff0c;风扇狂转噪音大得跟拖拉机似的&#xff1f;别担心&#xff0c;今天给大家安利一款超实用的软件 —— Macs Fan Control&#xff0c;它可是让苹果电脑“冷静”又…

mac 安装idea,碰到“已损坏,无法打开,您应该推出磁盘映像”的解决办法

1.打开终端&#xff0c;先输入如下命令&#xff0c;之后回车操作&#xff0c;碰到输入密码时&#xff0c;正常输入密码即可 sudo spctl --master-disable 2.打开系统设置-安全与隐私性-找到‘允许以下来源的应用程序’ &#xff0c;更改为任何来源&#xff0c;碰到输入密码时&…

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、k8s概述 2、Service在Kubernetes中的作用 二、ClusterIP类型 1、ClusterIP 类型的特点和用途 2、ClusterIP 的工作机制 3、…

Android studio 模拟器运行时弹窗显示The emulator process for AVD 模拟器的名字 has terminated 的解决方法

Android studio 问题解决方案 一&#xff1a;.运行模拟器报错展示二.解决步骤第一步:找到.android的文件夹第二步&#xff1a;剪切该文件到SDK的下载路径第三步&#xff1a;点开该文件第四步&#xff1a;找到配置文件第五步&#xff1a;编辑配置文件 三&#xff1a;设置环境变量…

Android Studio快速配置国内镜像源和HTTP代理

最近开始学习Android Studio开发&#xff0c;发现老是连接超时&#xff0c;下面配置下国内镜像源和HTTP代理&#xff0c;而且通过尝试发现最快下载速度方法 一.配置 SDK 镜像源 打开 Android Studio。 进入 File > Settings 然后点击 System Settings,点击 Android SDK。 …

mac/Windows安装python+pycharm【小白操作】

macOS通常自带Python&#xff0c;但建议安装最新版本的Python。你可以通过Homebrew来安装Python。 方法一&#xff1a;通过Homebrew安装Python 安装Homebrew&#xff08;如果尚未安装&#xff09;&#xff1a; 打开终端&#xff0c;输入以下命令并按回车&#xff1a; /bin/bas…

Mac电脑安装Postman教程

Postman 是一款非常常用的 API 调试工具&#xff0c;支持接口测试、自动化测试等功能&#xff0c;本文将分享在 Mac 电脑上安装 Postman 的完整步骤。 1. 下载 Postman 安装包 方法一&#xff1a;官网下载 打开 Postman 官方网站&#xff1a;https://www.postman.com/downlo…

MySQL连接报错处理:1130-host ... is not allowed to connect to this MySql server

在MySQL安装完成后&#xff0c;很多开发者会遇到这样一个问题&#xff1a; 错误代码 1130&#xff1a;host xxx.xxx.xxx.xxx is not allowed to connect to this MySql server 这个错误通常出现在你尝试通过远程工具&#xff08;如 Navicat、DBeaver 等&#xff09;连接 MySQL …

五、单元测试-概述入门

目录 main方法测试缺点&#xff1a; 在pom.xm中&#xff0c;引入junit的依赖。,在test/java目录下&#xff0c;创建测试类&#xff0c;并编写对应的测试方法&#xff0c;并在方法上声明test注解。 练习&#xff1a;验证身份证合法性 测试成功 测试失败 main方法测试缺点&am…

Python中的None值是什么?——浅析“无”的哲学与编程智慧

在Python编程世界中&#xff0c;None是一个极其特殊且基础的概念。它既是一个对象&#xff0c;又是表达“无”与“空”的唯一标识符。它的设计和应用不仅反映了Python对“无”这一哲学问题的简洁处理方式&#xff0c;也蕴含着深刻的编程理念和实践智慧。 本文将深入剖析Python…

Linux正则三剑客篇

一、历史命令 history 命令 &#xff1a;用于输出历史上使用过的命令行数量及具体命令。通过 history 可以快速查看并回顾之前执行过的命令&#xff0c;方便重复操作或追溯执行过程。 !行号 &#xff1a;通过指定历史命令的行号来重新执行该行号对应的命令。例如&#xff0c;若…

配网导线自取电式视频监测装置

在现代社会&#xff0c;电力如同城市的血脉&#xff0c;支撑着生活与生产的正常运转。而电力配网系统&#xff0c;作为电力传输和分配的“最后一公里”&#xff0c;其稳定运行尤为关键。然而&#xff0c;复杂的配电设备、暴露的线路以及多变的外部环境&#xff08;如人为施工破…

8天Python从入门到精通【itheima】-60~61

目录 60节-变量的作用域 1.局部变量 2.局部变量的代码演示 3.全局变量 4.全局变量的代码演示 5.global关键字 【1】体会局部变量和全局变量的区别 【2】global关键字&#xff1a;将变量直接声明为全局变量 6.小节总结 61节-第五章末尾-关于函数的综合案例-ATM机 1.案例…

Java函数式编程(上)

课程&#xff1a;黑马程序员Java函数式编程全套视频教程&#xff0c;Lambda表达式、Stream流、函数式编程一套全通关_哔哩哔哩_bilibili 函数式编程的优点&#xff1a; 代码简洁功能强大并行处理链式调用延迟执行 一、函数伊始 函数是一段可重复使用的代码块&#xff0c;用于…