构造函数中的赋值运算符

luG_0

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

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++ 语言的语法。

以这种方式编写的原因是(至少对于类成员)初始化程序使用提供的参数调用类的构造函数。它不会创建类型,然后为它们分配值。使用初始化器而不是在构造函数体中赋值的全部意义在于避免构造一个对象然后为其赋值的双重步骤。

如果您有 3 个 classes AB并且CwhereCatypeAbtype 的成员B那么这个构造函数:

C() :
  a(1234),
  a(4567)
{
}

等价于类外的以下代码:

A a(1234);
B b(4567);

而这个构造函数:

C()
{
   a = 1234;
   b = 4567;
}

相当于:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从赋值运算符调用构造函数

使typedef的构造函数/赋值运算符成为朋友函数

重载的赋值运算符函数和复制构造函数中的错误

使用STL向量复制构造函数与赋值运算符

未实现赋值运算符时调用构造函数

移动构造函数并移动类的赋值运算符

隐式移动构造函数和赋值运算符

使用赋值运算符而不是隐式构造函数

复制构造函数,赋值运算符C ++

C ++复制/移动构造函数和赋值运算符

C ++:“ T a = b”-复制构造函数或赋值运算符?

重载赋值运算符与提供隐式构造函数

复制构造函数和复制赋值运算符?

根据移动赋值运算符移动构造函数

复制构造函数和默认赋值运算符

为什么在赋值运算符之后在此代码中调用复制构造函数?

C ++中的赋值运算符模板和复制构造函数

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

在c ++ 98中实现move构造函数和move赋值运算符,以实现更好的性能

如何隐式复制构造函数/赋值运算符中的成员?

如何在临时容器类中实现复制构造函数和赋值运算符?

运算符<<在构造函数中的重载

为什么在函数中创建对象并返回它调用复制构造和移动赋值运算符?

std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

链表:如何实现析构函数、复制构造函数和复制赋值运算符?

比较运算符与 JavaScript中的赋值运算符

为什么即使缺少移动构造函数和移动赋值运算符也可以“移动”对象?

移动构造函数和移动赋值运算符与复制省略

为用户定义的类正确调用复制构造函数/赋值运算符