拷贝构造函数的初始化列表是在拷贝构造函数的定义中出现的一组初始值,用于初始化新创建的对象的成员变量。它的语法是在构造函数的声明后面使用冒号(
:
)来开头,然后列出要初始化的成员变量和它们的初始值。初始化列表的优点在于它允许在对象构造之前对成员变量进行初始化,并且可以直接初始化成员变量,而不是先调用默认构造函数再进行赋值。这样可以提高效率,避免不必要的额外操作。
示例:
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_NPCName
和 m_nHP
。这意味着当调用拷贝构造函数时,会将另一个 RolePlayer
对象的 m_NPCName
和 m_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
类型的指针,它指向的是动态分配的内存。在拷贝构造函数中只是简单地复制了指针的值,这意味着新对象和原对象将共享相同的内存地址,而不是进行深拷贝。这可能会导致潜在的问题,这个问题我们留到下一篇内容深拷贝与浅拷贝中进行分析。