为什么不能对构造函数执行此操作
Person::Person(std:: string tname,int tage):
name=tname,
age=tage
{}
但是这样做非常好
Person::Person(std:: string tname,int tage):
name(tname),
age(tage)
{}
其中name是一个字符串成员变量,age是一个int成员变量。
??
答案 0 :(得分:2)
您不能这样做,因为那不是C ++语言的语法。
之所以这样写是因为(至少对于类成员而言)初始化程序使用提供的参数调用类的构造函数。它不会创建类型,然后为它们分配值。使用初始化程序而不是在构造函数主体中分配值的全部目的是避免构造对象然后为其分配值的双重步骤。
如果您有3个类A
,B
和C
,其中C
具有类型a
和{{1}的成员A
},类型为b
,然后是此构造函数:
B
等同于类之外的以下代码:
C() :
a(1234),
a(4567)
{
}
此构造函数:
A a(1234);
B b(4567);
等效于:
C()
{
a = 1234;
b = 4567;
}
在这些简单的情况下,编译器可能会优化这些小的差异,但是对于更复杂的成员对象,默认构造和随后的赋值可能会非常昂贵甚至无法实现(例如,如果成员对象没有默认构造函数)。