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

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

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

相关推荐

  1. C++ 拷贝构造函数

    2024-04-30 03:44:02       57 阅读
  2. C++ 拷贝构造函数

    2024-04-30 03:44:02       54 阅读
  3. C++中构造函数以及默认拷贝构造函数

    2024-04-30 03:44:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 03:44:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 03:44:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 03:44:02       87 阅读
  4. Python语言-面向对象

    2024-04-30 03:44:02       96 阅读

热门阅读

  1. vue3 element ui plus 登录(本人空间有源码下载)

    2024-04-30 03:44:02       31 阅读
  2. 推动数字化智变发展 锐捷网络保持行业领先

    2024-04-30 03:44:02       32 阅读
  3. typora中如何使用cos存储

    2024-04-30 03:44:02       35 阅读
  4. Python wireshark抓包及分析

    2024-04-30 03:44:02       46 阅读
  5. 【MHA】MySQL高可用MHA介绍5-所有参数

    2024-04-30 03:44:02       28 阅读
  6. 持续集成和持续部署(CI/CD)

    2024-04-30 03:44:02       36 阅读
  7. 汽车轮胎打气泵方案的开发与参数简介

    2024-04-30 03:44:02       29 阅读
  8. ChatGPT 如何改变移动测试的游戏规则

    2024-04-30 03:44:02       37 阅读
  9. ansible提示 python 报错的问题及解决

    2024-04-30 03:44:02       30 阅读
  10. MongoDB聚合运算符:$stdDevPop

    2024-04-30 03:44:02       38 阅读
  11. 油烟净化器:城市生态建设的新力量

    2024-04-30 03:44:02       36 阅读