C++重要知识点

右值引用

参考从4行代码看右值引用

  1. 什么叫左值,什么叫右值?
    可以对表达式取地址的是左值,不能对表达式取地址的是右值。
    例如:int a = 1;
    这里a是变量,在栈中为其分配了具体的地址,是左值。1是右值。
    例如:int a = std::max(1, 3);
    max方法的返回值是右值,在赋值给a后会被销毁,因此是右值。
  2. 什么是右值引用?
    int& a = std::max(1, 3);//error.左值引用不能绑定右值。
    int&& a = std::max(1, 3);//correct. 右值引用可以绑定右值。
    通过右值引用的声明,右值不会被立刻销毁,其生命周期与右值引用相同。
    const int& a = std::max(1, 3);同样可以做到这一点。
  3. 右值引用有什么用?

(1)减少拷贝构造

class A {
}

A getA(){
	return A();
}

int main(){
	A a = getA();//正常情况下调用构造函数1次,拷贝2次(返回值拷贝到临时空间,从临时空间拷贝到a),析构3次。
	A& a = getA();//编译错误,左值引用不能引用右值。
	A&& a = getA();//构造1次,拷贝1次(从返回值拷贝到临时空间)。
}

(2) 避免不必要的深拷贝。
(3) 完美转发。形参会改变右值的类型,用右值引用可实现完美转发。

在C++中,随时要注意对象的拷贝
例如

vector<string> v = {"hello", "change", "needle"};
for(auto s: v){//const auto& s或者 auto&& s
	std::cout<<s<<std::endl;
}

这里在循环时就发生了对象的拷贝,若要避免这种拷贝,可以使用右值引用或者常量引用。

Lambda表达式

参考:https://www.cnblogs.com/DswCnblog/p/5629165.html
完整声明:[capture list] (params list) mutable exception-> return type { function body }
capture list:捕获外部变量列表,声明作用域内哪些变量可以在表达式中使用。
params list:参数列表。
mutable:指示符,用来说明是否可以修改捕获的变量。
exception:异常。
return type:返回值。
function body:方法体。
例子:

int a = 123;
auto f = [a] { return a+1; }; //捕获外部变量

int a = 123;
auto f = [] (int a)-> int { return a+1; }(a);//传参数 

typedef和#define

二者都是替对象取别名。
#define在预编译阶段处理,C中定义的语法。简单而机械的替换,没有类型检查。
typedef是关键字,在编译阶段被处理,有类型检查功能。在自己定义的作用域内生效。但是函数里面不能定义typedef

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值