【问题标题】:Initializing data-member references using initialization lists in C++在 C++ 中使用初始化列表初始化数据成员引用
【发布时间】:2011-08-09 19:20:44
【问题描述】:

堆垛机朋友,

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

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 cvalue = 1000; CC refCC(cvalue);

AA aaObj(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. 从不调用重写的赋值运算符。

我的问题很简单:

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

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

谢谢,

德科斯托。

【问题讨论】:

  • 1.您应该剪切并粘贴您的真实代码。您的构造函数有语法错误。 2.operator=不是拷贝构造函数,它是赋值运算符。你是对的,你的代码从不使用它。它使用复制构造,但您尚未定义复制构造函数。
  • CC:CC(int&amp; value)::m_cc(value) 应该是 CC::CC(int&amp; value):m_cc(value) 你在这里输入代码了吗?
  • 行 "AA:AA(CC& refCC): m_cc(refCC)" 永远不会编译,因为你在 "AA" 类中没有成员 "m_cc"。因此,您没有发布您要询问的代码。问代码 X 和邮政编码 Y 是很愚蠢的。
  • 这里 CC:CC(int& value) 和这里 AA:AA(CC& refCC) 仍然缺少 colon

标签: c++ constructor scope initialization


【解决方案1】:

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

【讨论】:

  • 默认为类创建了哪些其他构造或方法?它是标准的一部分吗??
  • stackoverflow.com/questions/4172722,他们在那里给出。是的,这是标准的。
【解决方案2】:

您正在复制构造以创建 m_cInstance,因此您似乎不会记录它。 m_cInstance 使用 refCC 的副本更新一次,即使 refCC 在实例外部更改也不会更改。

【讨论】:

    【解决方案3】:

    有一个复制构造函数提供给您的类(由编译器),如果我理解正确,您可能会将您定义的 operator=(const C&amp; other) 与复制构造函数混淆。

    对于class CC,复制构造函数会有这样的声明

    CC(const CC&amp; C);

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 2011-12-01
      • 2011-07-14
      • 2015-02-07
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多