C++:赋值运算符

这篇博客详细介绍了C++中的赋值运算符,包括简单赋值和复合赋值,以及它们的语法、运算符关键字和示例。讨论了赋值运算符如何作用于不同类型的对象,如算术类型、类类型、引用类型,并提到了复合赋值运算符的运算过程。还指出赋值运算符的结果是左值,并与初始化进行了对比。

语法

表达式赋值运算符表达式

assignment-operator: one of
 = *= /= %= += -= <<= >>= &= ^= |=

备注

赋值运算符将值存储在由左操作数指定的对象中。 有两种类型的赋值运算:

简单赋值,其中第二个操作数的值存储在第一个操作数指定的对象中。

复合赋值:在存储结果之前执行算术、移位或位运算。

下表中的所有赋值运算符 = 都是复合赋值运算符。

赋值运算符表

在这里插入图片描述

运算符关键字

其中三个复合赋值运算符具有等效关键字。 它们分别是:
在这里插入图片描述

C + + 将这些运算符关键字指定为复合赋值运算符的替代拼写。 在 C 中,在标头中以宏形式提供备用拼写 <iso646.h> 。 在 c + + 中,替换拼写是关键字;<iso646.h>不推荐使用或 c + + 等效项 。 在 Microsoft c + + 中, /permissive- /Za 需要或编译器选项来启用备用拼写。

示例

// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include <iostream>
using namespace std;
int main() {
   int a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555;

   a += b;      // a is 9
   b %= a;      // b is 6
   c >>= 1;      // c is 5
   d |= e;      // Bitwise--d is 0xFFFF

   cout  << "a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555" << endl
         << "a += b yields " << a << endl
         << "b %= a yields " << b << endl
         << "c >>= 1 yields " << c << endl
         << "d |= e yields " << hex << d << endl;
}

简单赋值

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

const 和类型的对象 volatile 可以分配给只是或不是或的类型的左值 volatile const volatile 。

对类类型的对象( struct 、 union 和类型)的赋值 class 由名为的函数执行 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;

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

UserType1 A;
UserType2 B;

B = A;

赋值语句

B = A;

可能具有以下效果之一:

为调用函数 operator= UserType2 ,同时提供 operator= UserType1 参数。

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

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

复合赋值

复合赋值运算符在赋值运算符表中显示。 这些运算符的形式为e1 op = e2,其中e1是不可修改的 const 左值, e2为:

算术类型

如果op为或,则为指针 +****-

E1 op = e2窗体表现为e1 = e1 op e2,但e1只计算一次。

对枚举类型的复合赋值将生成错误消息。 如果左操作数为指针类型,则右操作数必须是指针类型,或者必须是计算结果为0的常量表达式。 如果左操作数为整数类型,则右操作数不能是指针类型。

赋值运算符的结果

赋值后,赋值运算符将返回由左操作数指定的对象的值。 获得的类型是左操作数的类型。 赋值表达式的结果始终为左值。 这些运算符具有从右向左的关联性。 左操作数必须为可修改的左值。

在 ANSI C 中,赋值表达式的结果不是左值。 这意味着 (a += b) += c C 中不允许使用合法的 c + + 表达式。

该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处,本文章博客地址:https://blog.youkuaiyun.com/it_cplusplus/article/details/118501420

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值