【C++11】左值、右值、将亡值

值类别

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);
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦樂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值