何谓对象?
这里所说的对象是广义上的,而不仅仅是狭义的类/对象(class/object)。
在C/C++中,所谓的对象指的是执行环境中一块存储区域(a region of storage),
该存储区域中的内容则代表了该对象的值(value)。注意到我们这里所说的"代
表",对于一个对象,如果我们需要取出它的值,那么我们需要通过一定的
类型(type)来引用它。使用不同的类型,对同一对象中的内容的解释会导致
可能得到不同的值,或者产生某些未定义的行为。
何谓变量?
经常有人会把变量与对象二者混淆。所谓变量是一种声明,通过声明,
把一个名字与一个对象对应起来,当我们使用该名字时,就表示了我们对该
对象进行某种操作。但是并不是每个对象都有名字,也并不意味着有对应的
变量。比如临时对象(temporary object)就没有一个名字与之关联(不要误称
为临时变量,这是不正确的说法)。
左值 右值
先看一个例子(出自《C专家编程》)
一个赋值表达式: X = Y;
在这个表达式里,符号X的含义是X所代表的地址,这被称为左值,左值
在编译时可知,左值表示存储结果的地方;
在这个表达式里,符号Y的含义是Y所代表的地址的内容,这被称为右值,
右值在运行时才可知,如无特别说明,右值表示“Y的内容”。
按照C的定义,左值是一个引用到对象的表达式,通过左值我们可以取出
该对象的值。通过可修改的左值表达式(modifiable lvalue)我们还可以修改
该对象的值。(需要说明的是,在C++中,左值还可以引用到函数,即表达
式f如果引用的是函数类型,那么在C中它既不是左值也不是右值;而在
C++中则是左值)。因为左值引用到某一对象,因此我们使用&对左值表
达式(也只能对左值表达式和函数)取址运算时,可以获得该对象的地址
(有两种左值表达式不能取址,一是具有位域( bit-field )类型,因为实现中
最小寻址单位是 byte;另一个是具有register指定符,使用register修饰的变
量编译器可能会优化到寄存器中).
与左值相对应的另一个概念是右值(rvalue)。在C中,右值也用表达式的
值(value of the expression)来表达。即右值强调的不是表达式本身,而是
该表达式运算后的结果。这个结果往往并不引用到某一对象,可以看成
计算的中间结果;当然它也可能引用到某一对象,但是通过该右值表达
式我们不能直接修改该对象。
关于++i 和 i++
++i的实现:++i是直接给i变量加1,然后返回i本身,因为i是变量,
所以可以被赋值,
即 int & ++(& i)
{
i=i+1;
return i;
}
当然,以上代码只是说明问题,不能运行,只是说明++i是左值表达式
i++的实现:
int ++(int i)
{
int temp=i;
i=i+1;
return temp;}
返回临时对象,然后临时对象不存在了,所以,不能再被赋值,因此
是右值表达式