第2.5章: 赋值

English

什么是赋值?

在 C++ 中,赋值指的是在对象已经初始化之后,给它一个新的值。 赋值不是初始化。初始化发生在对象被创建并获得第一个值的时候。 赋值发生在之后,当你替换该对象中存储的值时。

赋值示例


#include <fast_io.h>
#include <cstddef>
#include <cstdint>

int main()
{
    using namespace ::fast_io::iomnp;

    // Initialization
    ::std::size_t a{10};             // object a initialized to 10
    println("a = ", a);              // prints 10

    // Assignment
    a = 20;                          // assign new value to a
    println("a = ", a);              // prints 20

    // Multiple assignments
    ::std::int_least32_t b{5};       // initialized to 5
    println("b = ", b);              // prints 5
    b = 15;                          // assigned new value
    println("b = ", b);              // prints 15
    b = b + 10;                      // assigned result of expression
    println("b = ", b);              // prints 25

    // Boolean assignment
    bool flag{false};                // initialized to false
    println("flag = ", flag);        // prints 0
    flag = true;                     // assigned new value
    println("flag = ", flag);        // prints 1

    // Assignment between objects
    ::std::size_t x{100};
    ::std::size_t y{200};
    println("x = ", x, " y = ", y);  // prints 100 200
    x = y;                           // assign value of y to x
    println("x = ", x, " y = ", y);  // prints 200 200
}

赋值 vs 初始化

区分初始化和赋值很重要:


#include <fast_io.h>

int main()
{
    using namespace ::fast_io::iomnp;

    int i = 5;       // initialization
    println("i = ", i);

    i = 10;          // assignment
    println("i = ", i);
}

要点:初始化只发生一次,即在对象被创建时。 赋值在对象的生命周期内可以发生许多次。

左值与右值

要理解赋值,我们需要了解左值(lvalue)与右值(rvalue)的概念:


#include <fast_io.h>

int main()
{
    using namespace ::fast_io::iomnp;

    int x{5};          // x is an lvalue
    int y{10};         // y is an lvalue

    x = y;             // OK: lvalue (x) = lvalue (y)
    println("x = ", x);

    x = 42;            // OK: lvalue (x) = rvalue (42)
    println("x = ", x);

    // 42 = x;         // ERROR: rvalue cannot be on the left-hand side
}

要点:赋值左侧必须是左值。 右侧既可以是左值也可以是右值。 这一区分在 C++ 中是根本性的,在学习引用与移动语义时会更加重要。

对比表

概念 时机 语法 示例 说明
初始化 对象创建时 =、()、{} int x{5}; 给对象第一个值。
赋值 对象已存在之后 = x = 10; 替换对象当前的值。
左值 指代内存位置 可出现在左侧 x = 42; 具名对象、解引用的指针。
右值 临时值 可出现在右侧 x = y + 2; 字面量、临时结果。