C++:拷贝构造函数的初始化列表

embedded/2024/9/24 17:31:16/

拷贝构造函数的初始化列表是在拷贝构造函数的定义中出现的一组初始值,用于初始化新创建的对象的成员变量。它的语法是在构造函数的声明后面使用冒号(:)来开头,然后列出要初始化的成员变量和它们的初始值。初始化列表的优点在于它允许在对象构造之前对成员变量进行初始化,并且可以直接初始化成员变量,而不是先调用默认构造函数再进行赋值。这样可以提高效率,避免不必要的额外操作。

示例:
class RolePlayer {
public://带有初始化列表的拷贝构造函数RolePlayer(const RolePlayer & other) : m_NPCName(other.m_NPCName), m_nHP(other.m_nHP)   {std::cout << "拷贝构造函数执行成功" << std::endl;}void SetName(char * m_NPCName) {this->m_NPCName = m_NPCName;}
​char * GetName() {return this->m_NPCName;}private:char * m_NPCName;int m_nHP;

拷贝构造函数使用了初始化列表来初始化成员变量 m_NPCNamem_nHP。这意味着当调用拷贝构造函数时,会将另一个 RolePlayer 对象的 m_NPCNamem_nHP 成员变量的值分别复制到新对象的相应成员变量中。

在函数中进行调用:

int main() {
​RolePlayer roleA;char szBuffer[] = "WolF1";roleA.SetName(szBuffer);
​RolePlayer roleB(roleA);std::cout << roleB.GetName() << std::endl;
​
​system("pause");return 0;
}

创建一个 RolePlayer 对象 roleA,创建一个字符数组 szBuffer,并将字符串 "WolF1" 存储在其中。接着调用 SetName 方法,将 szBuffer 中的字符串作为 roleA 的名称设置。使用 roleA 对象创建另一个 RolePlayer 对象 roleB,这将触发拷贝构造函数的调用。在拷贝构造函数中,会将 roleA 的名称和HP值复制到 roleB 中。

最后输出的结果为:

可以看到此时roleB与roleA的名称一样也是WolF1,就是因为在拷贝构造函数中我们携带了初始化列表RolePlayer(const RolePlayer & other) : m_NPCName(other.m_NPCName), m_nHP(other.m_nHP),使得对象在构造之前直接对成员变量进行初始化。

但是在上述内容中存在问题:在拷贝构造函数中,m_NPCName 是一个指向 char 类型的指针,它指向的是动态分配的内存。在拷贝构造函数中只是简单地复制了指针的值,这意味着新对象和原对象将共享相同的内存地址,而不是进行深拷贝。这可能会导致潜在的问题,这个问题我们留到下一篇内容深拷贝与浅拷贝中进行分析。


http://www.ppmy.cn/embedded/16987.html

相关文章

4、Flink执行模式(流/批)详解(下)

1、执行模式设置 import org.apache.flink.api.common.RuntimeExecutionMode; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;/*** bin/flink run -Dexecution.runtime-modeBATCH <jarFile>*/ public class _01_RuntimeMode {public s…

学习OpenCV——CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法(一)

学习OpenCV——CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法&#xff08;一&#xff09; 1.代码段2.计算方法举例3.直接给出其余对应结果 1.代码段 以下取自OpenCV文档 #define CV_BIG_INT(n) #define CV_BIG_UINT(n) #define CV_CN_MAX 512 #define CV…

Node.js -- path模块

path.resolve(常用) // 导入fs const fs require(fs); // 写入文件 fs.writeFileSync(_dirname /index.html,love); console.log(_dirname /index.html);// D:\nodeJS\13-path\代码/index.html 我们之前使用的__dirname 路径 输出的结果前面是正斜杠/ &#xff0c;后面部分是…

使用Uiautomotorviewer无法获取手机页面元素+解决办法

在进行 Android 应用程序开发或测试时&#xff0c;有时会遇到以下错误&#xff1a; Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException这个错误可能会导致开发或测试过程中的一些困扰&#xff0c;但有一个简单的解决方法&#xff1a; 解决方法…

【blog项目】layui与jquery冲突导致鼠标悬停事件失效、如何调用layui.use()作用域里的方法

blog项目前台展示——查询数据库中的文章类型并展示时出现的bug 1 正常演示 2 用jquery查询数据库并添加到页面后 3 相关代码 <script src"/static/jquery-2.1.4.js"></script> <script src"/static/layui/layui.js"></script> …

迅雷不限速破解方法

背景&#xff1a;现在迅雷和百度云的下载速度真的太恶心了&#xff0c;所以总有大佬可以采用厉害的方法进行破解&#xff0c;在网上看了一圈&#xff0c;很多都是骗人或者是无效的&#xff0c;找了一个靠谱的方法&#xff0c;亲测速度能达到10M以上&#xff0c;非常给力。 以下…

保姆级银河麒麟V10高级服务器离线安装mysql5.7数据库

离线在银河麒麟高级操作系统v10安装mysql5.7 下载mysql5.7 MySQL :: Download MySQL Community Server (Archived Versions) 2、把下载好的包上传到服务器 3、解压 [root1-0001 ~]# cd /data/mysql[root1-0001 mysql]# tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz…

JavaSwing 高校体育馆管理系统的设计与实现

JavaSwing 高校体育馆管理系统的设计与实现 一、 要求完成的修改内容 1、优化用户管理模块 ​ 在高校体育场馆管理系统中用户管理模块的导入导出功能进行查询导出、用户点击单行导出和导入校验功能操作实现 2、优化高校体育场馆管理系统中功能模块** 在高校体育场馆管理系…