c++ - 在 C++ 中使用初始化列表初始化数据成员引用

标签 c++ constructor scope initialization

各位堆垛机,

考虑头文件中的以下两个简单类:

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

以下是一些观察结果:

  1. 注意实例AA中m_cInstance的地址与refCC的地址不同。

  2. 虽然CC的实例在AA的构造函数中是通过引用(refCC)传递的,但是成员变量“m_cInstance”本身就是一个单独的实例。

  3. 当“refCC”被创建时,CC 实例的构造函数被调用一次,即使在程序中存在两个不同的 CC 实例携带相同的状态。

  4. 永远不会调用覆盖的赋值运算符。

我的问题很简单:

如何在 AA 的构造函数中创建“m_cInstance”而不调用 CC 的构造函数或 CC 中定义的赋值运算符??

如果 CC 包含磁盘上文件的句柄作为成员变量呢?它在“m_cInstance”中的行为是什么??

谢谢,

德科斯托。

最佳答案

m_cInstance 是使用(在您的案例中提供的编译器)复制构造函数创建的。作为完整性检查,如果您需要定义赋值运算符,您可能还需要定义复制构造函数和析构函数(已知为三个 hereon wikipedia 的规则)

关于c++ - 在 C++ 中使用初始化列表初始化数据成员引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001709/

相关文章:

c++ - 当 vector 超出范围时防止数据被释放

python - 尝试更新 tkinter 类中的标签

c++ - const 类成员的自动扣除

c++ - 我如何在 C++03 中伪造构造函数继承?

generics - 如何为具有类型参数的类编写辅助构造函数?

c++ - 无法访问类中声明的私有(private)成员

scope - 如何正确处理 typescript 中的范围

c++ - winsock2:recvfrom() 函数以错误 10022(无效参数)结束

c++ - 编译器如何使用lib文件?

c++ - 为什么别名模板会给出冲突的声明?