值类别
C++表达式的两个独立的属性:类型、值类别;
值类别分为:左值、纯右值、将亡值;
有名字的将亡值->左值;没名字–>右值
左值
能用&取地址的表达式;
例如:int a;可以&a,所以a是左值;
所有具名对象都是左值。
纯右值
存粹的字面值,不能&
例如:NULL,false,10,4.21
纯右值都是没名字的,只可读不可写
将亡值
产生的临时量或临时对象,(如:函数调用时产生的临时空间)
若将亡值没有名字——右值;
若将亡值为内置类型(int、char、double、float、…)——纯右值。
例子:
int b=0;b++ = 10;/*表达式错误的原因:先对b进行一次拷贝产生临时量(将亡值),将得到的副本作为返回结果,然后对这个将亡值+1,由于该将亡值不具名,所以为右值,又因为它是int类型,所以为纯右值因为纯右值只能读不能改写,所以是错误的*/
将亡值在调用者的栈帧空间中,其数据由CPU数据寄存器存储。
int fun(int x){int a = x + 10;return a;}int main(){int a = 10, b = 20;int c = 0;c = fun(a);cout << c << endl;return 0;}
栈帧
每一个函数都会被分配一个栈帧;
当程序结束,栈帧被还给系统(程序应不再使用);
当返回引用(临时变量的引用)时会出现以下情况
int* fun(){int a = 10;return &a;}int main(){int* p = fun();cout <<"*p:"<< *p << endl;}
值是随机:
所以: 不要返回局部变量的引用和指针
(除非函数活得久:全局变量,static变量,)
引用进的可以引用出/或函数不释放指针空间
局部释放,该指针为失效指针
类类型
类类型是程序员自己设计的类型,不是内置类型(产生的将亡值可写)
类:是抽象出来的新数据类型
任何一个对象只能被构建一次,不能自己调用自己的构造函数。
析构函数没有重载— 只有一种死法。
类类型空间是当它被调用时系统才分配的空间,有空间不一定有对象,有对象一定有空间;
空间的来源:1.malloc或new,2.函数被调用,系统分配空间
匿名对象:将亡值,只在表达式中生存,表达式结束,他也析构;
class A{int m;public:A(int x):m(x){}A& operator(const A&it){if(this==&it)return *this;//防止this给自己赋值m = it.m;return *this;}}int main(){A a;//具名对象A(20);//匿名对象--将亡值a = A(10);}
不论全局变量在哪个位置,都比主函数先执行,进入主函数前全局量都被创建;
以下程序输出:1 3 2 析构2 析构3 析构1
所以全局–称为数据,局部量–称为变量
class A{public:A(int value) :a(value) { cout << value << endl; }~A() { cout << "析构" << a << endl; }int a;};A a(1);int main(){A b(2);}A c(3);