C++11 部分语言特性

右值引用

  • 左值:指可在赋值表达式等号左边出现的元素,包括具名对象、在栈数据段和堆数据段上分配的对象、其他对象的数据成员,或一切具有确定存储范围的数据项。

  • 左值引用:

int var = 42;
int& ref = var;
ref = 99; //var也被改为99
  • 右值:指只能在赋值表达式等号右边出现的元素,如字面值和临时变量。
  • 右值引用:使用两个&
int&& i=42;

用处

  • 从拷贝构造函数变为移动构造函数(只需要拷贝指向临时变量的指针,并将原来指向临时变量的指针改为空) 节约内存且省去了复制数据本体的时间。
  • 实现资源转移,不必复制整份数据,而可以将数据作为参数传入函数,对其中的某一部分进行处理。
  • 移动语义取代不合理的复制语义。

删除函数

如何禁止某个类的复制行为?
C++11:声明函数的语句只要追加"=delete"修饰,函数即被声明为删除。=delete可修饰任何函数。

class no_copies
{
public:
	no_copies(){}
	no_copies(no_copies const&) = delete;
	no_copies(& operator=(no_copies const&) = delete;
}

删除拷贝构造函数和复制赋值操作符,又显式写出移动构造函数和移动赋值操作符,就是一种move_only type。

class move_only
{
	std::unique_ptr(my_class) data;
public:
	move_only(const move_only&) = delete;
	move_only(move_only&& other):
		data(std::move(other.data))
	{}
	move_only& operator=(const move_only&) = delete;
	move_only& operator=(move_only&& other)
	{
		data=std::move(other.data);
		return *this;
	}
};
move_only m1;
move_only m2(m1);//错误
move_only m3(std::move(m1)); //正确 移动构造函数

默认函数

在目标函数声明后方添加"=default"则变为默认函数。默认构造函数、析构函数、拷贝构造函数、移动构造函数、复制赋值操作符和移动赋值操作符等菜有资格被设置为默认。

constexpr关键字

constexpr int square(int x)
{
	return x*x;
}
int array[square(5)];

假设某函数的参数和返回值都满足一定要求,且函数体足够简单,就可以被声明为constexpr函数,进而在常量表达式中使用。


来自:《C++并发编程实战》
欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值