定义构造函数的两种不同方式
Two different ways of defining a constructor
让我们有两段代码。每段代码都有两个类,这些类非常相似。唯一的区别在于定义类B
的构造函数。
第一个程序:
using namespace std;
class A
{
public:
A( int x ) : val( x ) { cout << val << endl; }
private:
int val;
};
class B
{
public:
B( int x ) { instanceA( x ); }
private:
A instanceA;
};
int main()
{
B instanceB( 5 );
}
第二个程序:
using namespace std;
class A
{
public:
A( int x ) : val( x ) { cout << val << endl; }
private:
int val;
};
class B
{
public:
B( int x ) : instanceA( x ) { }
private:
A instanceA;
};
int main()
{
B instanceB( 5 );
}
第一个程序中B
类的构造函数定义为:
B( int x ) { instanceA( x ) }
第二个程序中B
类的构造函数定义为:
B( int x ) : instanceA( x ) { }
第一个代码不起作用,第二个代码起作用-在这种情况下,用第一种和第二种方式定义构造函数与在全局中定义构造函数有什么区别
EDIT:不需要B( int x ) { instanceA( x ); }
而需要B( int x ) { instanceA = A( x ) }
对于第二种情况(成员初始化器列表),instanceA
将由A::A(int)
直接初始化。
对于第一种情况,instanceA
将首先由A::A()
(默认构造函数)初始化,稍后将执行构造函数的主体。因为A
没有默认的构造函数,所以它失败了。
初始化订单
3) 然后,按以下顺序初始化非静态数据成员类定义中的声明
4) 最后,构造函数的主体被执行
并且instanceA(x);
不会执行您期望的操作(即调用A::A(int)
来初始化它),它将被解析为instanceA.operator()(x);
,并且不会编译,因为它不提供operator()
。
instanceA( x );
不是函数
相关文章:
- 在C++中将函数压缩为两种方式
- 为什么两种不同的对象初始化方式给出不同的输出
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 将函数作为参数传递的两种方式之间的区别
- 初始化结构的两种方式
- 在两种情况下,铸造的工作方式不同
- 这两种方式有什么区别吗?
- 由于您可以在C 中以两种方式声明复制构造函数,这是正确的方式
- 定义构造函数的两种不同方式
- 尝试在Qt中连接隐藏信号的两种方式之间做出决定
- C++:如何使用CIN和File两种方式获取输入
- 在C++中定义虚拟继承的两种不同方式
- 为什么这两种访问C++映射对部分的方式不同
- openssl sha256两种计算方式的差异
- 在C++OpenMP中使用蒙特卡罗方法以两种方式计算圆周率
- 在堆栈上声明对象的两种方式之间的差异
- 使用默认构造函数的两种方式的区别
- 声明类实例的两种方式的不同之处
- 用两种不同的方式初始化指针会得到两种结果
- 在这两种包含相同标头的方式之间,编译器中是否发生了不同的事情