我有一个班级名称类型。 有什么区别:
1
Type t=a;
2
Type t(a);
'a'是某个变量。
之间有什么区别:
3
Type t;
4
Type t();
谢谢。
编辑: 有些答案相互矛盾。 有人有最终答案吗?
答案 0 :(得分:8)
Type t=a;
这是复制初始化(§8.5/ 15)。它要求Type
有一个非explicit
构造函数接受a
类型的参数,或a
可隐式转换为的类型。
Type t(a);
这是直接初始化(§8.5/ 16)。 t
可以从参数a
构造,即使相应的构造函数是explicit
。
Type t;
t
将默认初始化(§8.5/ 12)。
Type t();
这是一个名为t
的函数的函数声明,它按值返回Type
(§8.5/ 11)。
答案 1 :(得分:2)
1) Type t=a;
//复制初始化
2) Type t(a);
//复制构造(采用具有相同类型a
的参数的复制构造函数或构造函数)
然后:
1) Type t;
//默认构造函数
2) Type t();
// 不是构造:函数t的声明,它不需要任何东西并返回Type
答案 2 :(得分:2)
1)
Type t=a;
称为复制初始化。标记explicit
的构造函数不予考虑。
2)
Type t(a);
称为直接初始化。考虑所有构造函数,包括和不包含explicit
关键字。
3)
Type t;
称为默认初始化。调用默认构造函数(一个没有参数或默认所有参数)。
4)
Type t();
声明一个返回t
的函数Type
。这被称为最令人烦恼的解析。 (Type t{};
与#3默认初始化相同,但有一个可见的空参数列表。)
答案 3 :(得分:1)
Type t=a;
和Type t(a);
都是相同的。如果type
是默认类型,则两者都会调用复制构造函数。否则它是1
参数构造函数的对象初始化
Type t;
调用默认复制构造函数,而Type t();
是函数声明。