任何从给定基类明确派生的类的对象均可赋给基类的对象。反之则不然,因为有一个隐式转换,它能从派生类转换到基类,但不能从基类转换到派生类。例如:
// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
ABase() { cout << "constructing ABasen"; }
};
class ADerived : public ABase
{
public:
ADerived() { cout << "constructing ADerivedn"; }
};
int main()
{
ABase aBase;
ADerived aDerived;
aBase = aDerived; // OK
aDerived = aBase; // C2679
}
对引用类型的赋值的行为方式就像对引用所指向的对象进行赋值一样。
对于类类型对象,赋值与初始化不同。若要演示不同赋值和初始化的工作方式,请考虑以下代码
UserType1 A;
UserType2 B = A;
上面的代码显示了一个初始值设定项;它调用了采用 UserType2 类型的参数的 UserType1 的构造函数。给定以下代码
UserType1 A;
UserType2 B;
B = A;
赋值语句
B = A;
可能具有以下效果之一:
将为 UserType2 调用函数 operator=,前提是 operator= 提供 UserType1 参数。
如果存在显式转换函数 UserType1::operator UserType2,则调用该函数。
调用采用 UserType2::UserType2 参数并复制结果的构造函数 UserType1,前提是存在此类构造函数。
复合赋值
显示在的表中的复合赋值运算符以 e1 op= e2 的形式指定,其中 e1 是非常量类型的可修改左值,而 e2 是以下项之一:
算术类型
指针(如果 op 为 + 或 –)
e1 op= e2 形式的行为方式与 e1 = e1 op e2 的相同,但 e1 只计算一次。
对枚举类型的复合赋值将生成错误消息。如果左操作数属于指针类型,则右操作数必须属于指针类型或必须是计算结果为 0 的常量表达式。如果左操作数属于整数类型,则右操作数不能属于指针类型。
赋值运算符的结果
赋值后,赋值运算符将返回由左操作数指定的对象的值。获得的类型是左操作数的类型。赋值表达式的结果始终为左值。这些运算符具有从右向左的关联性。左操作数必须为可修改的左值。
在 ANSI C 中,赋值表达式的结果不是左值。因此,合法的 C++ 表达式 (a += b) += c 在 C 中是非法的。
注:相关教程知识阅读请移步到C++教程频道。










