C++ 构造函数中的赋值运算符

C++ 构造函数中的赋值运算符,c++,constructor,C++,Constructor,为什么我不能在我的构造函数上这样做 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成员变量 ?你不能这么做,因为那不是C++语言的语法。< /P> 这样写的原因是,至

为什么我不能在我的构造函数上这样做

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成员变量


你不能这么做,因为那不是C++语言的语法。< /P> 这样写的原因是,至少对于类成员,初始化器使用提供的参数调用类的构造函数。它不会创建类型,然后为其赋值。使用初始值设定项而不是在构造函数体中赋值的整个要点是避免了构造对象然后为其赋值的双重步骤

如果有3个类A、B和C,其中C的成员A为类型A,B为类型B,则此构造函数:

C() :
  a(1234),
  a(4567)
{
}
C()
{
   a = 1234;
   b = 4567;
}
相当于类外的以下代码:

A a(1234);
B b(4567);
鉴于本构装师:

C() :
  a(1234),
  a(4567)
{
}
C()
{
   a = 1234;
   b = 4567;
}
相当于:

A a; // default construct a
B b; // default construct b
a = 1234;
b = 4567;

在这些简单的情况下,编译器可能会优化这些小的差异,但是对于更复杂的成员对象,默认的构造和赋值可能是昂贵的,甚至是不可能的,例如,如果成员对象没有默认构造函数。

因为后者是C++语言设计者选择的语法,而前者不是。这是否意味着我不能在我的工作之外使用“this”关键字constructor@SaurabhKumar不能在非静态成员函数(包括构造函数)之外使用它;没关系。所以你的论点不成立。还=在初始化中使用时并不意味着赋值。@juanchopanza整数没有构造函数。。。还应注意A=1234和A;a=1234是不同的东西。现代编译器上的第一个将实际调用Aint构造函数。这是不相关的,但是OK,std::string foo=hello;关键是OP所显示的语法可以是有效的,并且与其他C++初始化语法规则兼容。这是初始化:intfoo=42。这也可以是初始化:仅在最近版本的C++中,FooNeN:n{n{}} JuangopANZA,旧版本至少在标准中没有这种优化,至少我知道,至少STD::字符串Fo= hello;将构造一个字符串,然后将hello分配给它。