赋值运算符和初始化

The assignment operator and initialization

提问人:Piero Borrelli 提问时间:9/26/2014 更新时间:9/26/2014 访问量:2971

问:

我正在学习 C++ 编程语言,我正在阅读有关赋值运算符 ( = ) 的章节。在 C++ 中,初始化和赋值是操作,因此我们可以使用相同的表示法。

但我的问题是:当我初始化一个变量时,我是用赋值运算符来做的吗?当我赋值给一个变量时,我是用赋值运算符来做吗?我认为唯一的区别是初始化和赋值之间,因为当我们初始化一个变量时,我们使用 assignmnet 运算符给它一个新值,当我们赋值给一个变量时,我们使用赋值运算符将该变量的旧值替换为新值。这是对的吗?

C++ 赋值运算符

评论

1赞 dyp 9/26/2014
“我正在阅读有关赋值运算符的章节”哪本书/教程/...?(但这可能无关紧要..)
1赞 Cory Kramer 9/26/2014
初始化变量时,通常会调用各种构造函数(default、copy、explicit 等)之一。

答:

0赞 Jack 9/26/2014 #1

你的想法是相当正确的。使用构造函数,您将分配该类型的新对象,该对象具有自己的开销。

相反,当您将赋值复制到变量时,您不想创建新对象,因为您已经有一个对象。您只需要将赋值对象左侧的相应成员变量设置为正确的大小即可。

例如:

MyClass object = MyClass(10); // here the constructor is called
MyClass other = MyClass(5); // here another constructor is called
object = other // here the copy assignment operator is called, you don't need to build any new object, just setting fields

此外,还有另一种情况调用复制构造函数,如下所示:

MyClass other2 = MyClass(object);

这里调用了一个特殊的构造函数,它基本上执行与复制赋值操作相同的工作,但使用一个新对象,而不是现有对象。

评论

2赞 E_net4 9/26/2014
IMO 您应该更清楚地区分“复制构造函数”和“复制分配”,以及使用 并不总是转化为分配操作这一事实。=
12赞 Ben Voigt 9/26/2014 #2

你问

当我初始化一个变量时,我是用赋值运算符来做的吗?

并说

当我们初始化一个变量时,我们用赋值运算符给它一个新值

但是,不,你不是。该符号用于复制初始化和赋值,但初始化不使用赋值运算符。变量的初始化实际上使用构造函数。=

在复制初始化中,它使用复制构造函数。

type x = e; // NOT an assignment operator

首先转换为 ,创建一个临时变量,然后通过复制该临时变量进行初始化。 根本没有被调用。etypetype::type(const type&)xtype::operator=(const type&)

还有直接初始化,它不使用符号:=

type x(e);
type x{e}; // since C++11
otherclass::otherclass() : x(e) {} // initialization of member variable

虽然初始化和赋值都为变量提供了一个值,但两者不使用相同的代码来执行此操作。


更多细节:在 C++11 及更高版本中,如果存在移动构造函数,则复制初始化将改用它,因为转换的结果是临时的。此外,在复制初始化中,编译器可以跳过实际调用复制或移动构造函数,它可以将初始值设定项直接转换为变量。但它仍然必须检查复制或移动构造函数是否存在以及是否可访问。复制构造函数也可以采用非常量引用。因此,可能是 that 被使用,或者(非常罕见),或者 that 被使用,而不是 .我上面描述的是最常见的情况。type::type(type&&)type::type(const type&&)type::type(type&)type::type(const type&)

评论

0赞 E_net4 9/26/2014
“First is converted to ”并不总是正确的,可能是另一个具有 1 个参数的非显式构造函数的参数。etypee
0赞 Ben Voigt 9/26/2014
@E_net4:这就是转换。单个参数构造函数称为转换构造函数。
0赞 E_net4 9/26/2014
好吧,我纠正了。我的思路太实际了。
0赞 Piero Borrelli 9/26/2014
@BenVoigt对不起,我是初学者,你能用非常简单的方式解释我吗?我只知道变量的基本知识,从键盘读取并在屏幕上打印,谢谢
1赞 Ben Voigt 9/26/2014
@PieroBorrelli:简单的解释是,当变量定义中的变量名称后面出现“=”时,它不是赋值运算符。它引入了一个初始值设定项,该初始值设定项由构造函数处理,而不是由赋值操作处理。