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


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

    示例:
    1. class RolePlayer {
    2. public:
    3.    //带有初始化列表的拷贝构造函数
    4. RolePlayer(const RolePlayer & other) : m_NPCName(other.m_NPCName), m_nHP(other.m_nHP) {
    5. std::cout << "拷贝构造函数执行成功" << std::endl;
    6. }
    7.    
    8.    void SetName(char * m_NPCName) {
    9. this->m_NPCName = m_NPCName;
    10. }
    11. char * GetName() {
    12. return this->m_NPCName;
    13. }
    14. private:
    15. char * m_NPCName;
    16. int m_nHP;

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

    在函数中进行调用:

    1. int main() {
    2. RolePlayer roleA;
    3. char szBuffer[] = "WolF1";
    4. roleA.SetName(szBuffer);
    5. RolePlayer roleB(roleA);
    6. std::cout << roleB.GetName() << std::endl;
    7. system("pause");
    8. return 0;
    9. }

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

  • 相关阅读:
    威班11月份PMP模拟考试实录
    数据链路层-可靠传输机制(选择重传协议SR)
    关于MYSQL增量备份介绍
    @敏捷组织从业者,开放敏捷架构O-AA™标准考试及认证项目重磅上线!
    路特软件戚俊:云原生助力SaaS类业务租户高效隔离
    Flink SQL: UNLOAD Statements
    JS 解构赋值
    react利用wangEditor写评论和@功能
    java编程基础总结——14.异常处理
    Docker:入门
  • 原文地址:https://blog.csdn.net/WolvenSec/article/details/138173566