我正在学习C ++编程语言,并且我正在阅读有关赋值运算符(=)的章节。在C ++初始化和赋值操作非常相似,我们可以使用相同的表示法。
但我的问题是:当我初始化变量时,我是使用赋值运算符吗?当我分配给变量时,我是否使用赋值运算符?我认为唯一的区别在于初始化和赋值,因为当我们初始化变量时,我们使用assignmnet运算符给它一个新值,当我们分配给变量时,我们用一个新值替换该变量的旧值。赋值运算符。这样对吗 ?
答案 0 :(得分:5)
你问了
当我初始化变量时,我是使用赋值运算符吗?
并说
当我们初始化变量时,我们使用赋值运算符
给它一个新值
但是,不,你不是。符号=
用于复制初始化和赋值,但初始化不使用赋值运算符。变量的初始化实际上使用了构造函数。
在复制初始化中,它使用复制构造函数。
type x = e; // NOT an assignment operator
首先e
转换为type
,创建一个临时变量,然后type::type(const type&)
通过复制临时变量来初始化x
。根本没有调用type::operator=(const type&)
。
还有直接初始化,它不使用=
符号:
type x(e);
type x{e}; // since C++11
otherclass::otherclass() : x(e) {} // initialization of member variable
虽然初始化和赋值都给变量赋值,但两者不使用相同的代码来执行它。
进一步的细节:使用C ++ 11及更高版本,如果有一个移动构造函数,复制初始化将使用它,因为转换的结果是临时的。此外,在复制初始化中,允许编译器跳过实际调用副本或移动构造函数,它可以将初始化程序直接转换为变量。但它仍然必须检查复制或移动构造函数是否存在且可访问。复制构造函数也可以采用非const引用。因此,可能使用type::type(type&&)
,或使用type::type(const type&&)
(非常罕见)或使用type::type(type&)
,而不是type::type(const type&)
。我上面描述的是最常见的情况。
答案 1 :(得分:0)
你的想法很正确。使用构造函数,您将分配该类型的新对象,该对象有自己的开销。
当您将赋值复制到变量时,您不想创建新对象,因为您已经有了一个。您只需要将赋值对象左侧的相应成员变量设置为正确的大小。
例如:
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);
这里调用一个特殊的构造函数,它基本上执行复制赋值操作的相同工作,但是使用新对象,而不是现有对象。