使用初始化列表时未调用两次基构造函数
Base constructor not called twice when using initialization list
#include <iostream>
using namespace std;
class Counter
{
protected:
unsigned int count;
public:
Counter() : count(0) {cout << "nCounter Default Constructor";}
Counter(int i ) : count (i) {cout << "nCounter Argument Constructor";}
unsigned int getData ()
{
return count;
}
Counter operator ++ () // increment (prefix)
{
++count;
return Counter(count);
}
};
class inCounter : public Counter
{
public:
inCounter() : Counter() { cout << "ninCounter Default Constructor"; }
inCounter(int c ) : Counter ( c ) {cout << "ninCounter Argument Constructor";}
Counter operator -- ()
{
--count;
return Counter ( count ) ;
}
};
void main ()
{
inCounter c1(10); }
我原以为输出是:
计数器参数构造函数
inCounter参数构造函数
计数器参数构造函数
但结果是
计数器参数构造函数
inCounter参数构造函数
为什么会这样?
我期望第一个输出的原因是,在创建对象c1
的过程中,首先调用基类构造函数,因此打印"Counter Argument Constructor"
。然后,调用派生类构造函数,因此打印"inCounter Argument Constructor"
。但是派生类构造函数再次调用Counter
构造函数。因此,应再次打印"Counter Argument Constructor"
。
如果通过初始化列表初始化成员,则将替换编译器将执行的默认初始化。
这不是一个"附加"调用,因为这意味着一个对象被构造了两次。
此外,您可以通过在您的案例中使用默认参数来简化事情。这将允许您删除一些不必要的构造函数。
inCounter(int c=0) : Counter (c)
{
cout << "ninCounter Argument Constructor";
}
我想您对程序中的以下行感到困惑
inCounter(int c ) : Counter ( c ) {cout << "ninCounter Argument Constructor";}
即使您的代码中有Counter(c(,它也不会调用构造函数两次。相反,它调用基类构造函数的参数化版本,如下所示。
Counter(int i ) : count (i) {cout << "nCounter Argument Constructor";}
所以正确的输出是
Counter Argument Constructor
inCounter Argument Constructor
相关文章:
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- pair的两个构造函数几乎相同,为什么不生成构建错误?
- 为什么<T> LLVM 中的预期为 Expect&&... 实现两个构造函数<T>?
- 为什么我的类只适用于两个构造函数 C++
- 两个构造函数(带和不带参数),没有输入 -> 没有参数运行。跳过上述类中的构造函数
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 除了两个构造函数外,C++库导入也可以工作
- 两次构造对象
- 在两个构造函数之前将我的静态数据成员在 CPP 文件中初始化为 0
- 如何有条件地在具有相同签名的两个构造函数之间切换
- RAII 在两个构造函数之间进行选择的方式
- 调用对数组引用两次的函数
- std::make_shared在VS2012中进行了两次构造函数调用
- 具有两个构造函数的抽象类
- 如何在c++中实现二次构造函数
- 这两个构造函数调用之间的区别
- 为什么在我的程序中调用两个构造函数
- 组合复制和移动的两个构造函数
- 为什么这两个构造函数一起不会产生歧义错误?
- C++两次传递函数指针导致问题