第2.5章: 赋值
什么是赋值?
在 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)的概念:
- 左值(left value):指代某个内存位置、且可以出现在赋值左侧的表达式。
例如:具名对象如
x,解引用指针如*p。 - 右值(right value):不会在表达式之后继续存在的临时值或字面量。
例如:
42、x + y、3.14。
#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; |
字面量、临时结果。 |