简单赋值 (C++)

简单赋值运算符 (=) 将使第二个操作数的值存储在第一个操作数指定的对象中。 如果两个对象都是算术类型,则在存储值之前,正确的操作数将转换为左侧的类型。

常量和可变类型的对象可赋给可变类型的左值或者既不是常量类型也不是可变类型的左值。

对类类型(结构、联合和类类型)的对象的赋值由名为 operator= 的函数执行。 此运算符函数值的默认行为是执行按位复制;但是,可使用重载运算符修改此行为。(有关详细信息,请参阅重载运算符。)

任何从给定基类明确派生的类的对象均可赋给基类的对象。 反之则不然,因为有一个隐式转换,它能从派生类转换到基类,但不能从基类转换到派生类。 例如:

// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
    ABase() { cout << "constructing ABase\n"; }
};

class ADerived : public ABase
{
public:
    ADerived() { cout << "constructing ADerived\n"; }
};

int main()
{
    ABase aBase;
    ADerived aDerived;

    aBase = aDerived; // OK
    aDerived = aBase; // C2679
}

对引用类型的赋值的行为方式就像对引用所指向的对象进行赋值一样。

对于类类型对象,赋值与初始化不同。 若要演示不同赋值和初始化的工作方式,请考虑以下代码

UserType1 A;
UserType2 B = A;

上面的代码显示了一个初始值设定项;它调用了采用 UserType1 类型的参数的 UserType2 的构造函数。 给定以下代码

UserType1 A;
UserType2 B;

B = A;

赋值语句

B = A; 

可能具有以下效果之一:

  • 将为 UserType2 调用函数 operator=,前提是 operator= 提供 UserType1 参数。

  • 如果存在显式转换函数 UserType1::operator UserType2,则调用该函数。

  • 调用采用 UserType1 参数并复制结果的构造函数 UserType2::UserType2,前提是存在此类构造函数。

请参见

参考

使用二元运算符的表达式