各位堆垛机,
考虑头文件中的以下两个简单类:
Class CC
{
public:
CC(int& value);
C& operator=(const C& other);
{
cout<<" From copy constructor ";
}
int m_cc;
};
Class AA
{
public:
AA( CC& refCC);
CC m_cInstance;
}
以下是.cpp文件中的内容。
CC:CC(int& value): m_cc(value)
{
cout<<" Constructor of CC" <<endl;
m_cc++;
}
AA:AA(CC& refCC): m_cInstance(refCC)
{
cout<<" The value of m_cc in refCC is: "<< refCC.m_cc;
cout<<" The address of m_cc in refCC is: "<< &refCC.m_cc;
cout<<" The address of refCC is: "<< &refCC;
cout<<" The value of m_cc in m_cInstance is: <<m_cInstance.m_cc;
cout<<" The address of m_cc in m_cInstance is: <<&m_cInstance.m_cc;
cout<<" The address of m_cInstance is: <<&m_cInstance;
}
我在我的 main.cpp 文件中按以下方式使用上面两个声明的简单类:
int 值 = 1000; CC refCC(cvalue);
AAaaObj(refCC);
这是程序的输出:
Constructor of CC
The value of m_cc in refCC is: 1001
The address of m_cc in refCC is: 0x12ff20
The address of refCC is: 0x12ff20
The value of m_cc in m_cInstance is: 1001
The address of m_cc in m_cInstance is: 0x12ff14
The address of m_cInstance is: 0x12ff14
以下是一些观察结果:
注意实例AA中m_cInstance的地址与refCC的地址不同。
虽然CC的实例在AA的构造函数中是通过引用(refCC)传递的,但是成员变量“m_cInstance”本身就是一个单独的实例。
当“refCC”被创建时,CC 实例的构造函数被调用一次,即使在程序中存在两个不同的 CC 实例携带相同的状态。
永远不会调用覆盖的赋值运算符。
我的问题很简单:
如何在 AA 的构造函数中创建“m_cInstance”而不调用 CC 的构造函数或 CC 中定义的赋值运算符??
如果 CC 包含磁盘上文件的句柄作为成员变量呢?它在“m_cInstance”中的行为是什么??
谢谢,
德科斯托。
最佳答案
m_cInstance 是使用(在您的案例中提供的编译器)复制构造函数创建的。作为完整性检查,如果您需要定义赋值运算符,您可能还需要定义复制构造函数和析构函数(已知为三个 here 和 on wikipedia 的规则)
关于c++ - 在 C++ 中使用初始化列表初始化数据成员引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001709/