C++临时对象

要理解临时对象,可能先需要搞清楚lvalue,rvalue的区别:

每个表达式的结果都是lvalue或rvalue。lvalue指的是内存中持续存储数据的一个地址。而rvalue是临时存储的表达式结果。之所以称为lvalue,是因为所有产生lvalue的表达式都可以出现在赋值语句中等号的左边,如果表达式结果不是lvalue,则他是rvalue。(引用自深入理解visual c++入门经典Page61)

 

对于一个简单的例子,认为下面的一段代码:

int func(int lhs, int rhs) 
{ 
    return lhs + rhs; 
} 

int main() { 
    int a = 1, b = 2, c = 3; 
    return func(a * c, b * c); 
} 

因为FUNC需要两个整数,程序必须计算a * cb * c的值,并将它们存储的地方 - 它不能存储他们在abc。所以生成的代码就相当于:

int lhsParam = a * c; 
int rhsParam = b * c; 
return func(lhsParam, rhsParam); 

同样,在func()最后我们返回一个计算值,lhs + rhs。编译器必须将其存储在新的位置。

对于整数等等,这似乎很简单,但考虑,而不是

int function(std::string filename); 
function("hello"); 

filename必须是一个std::string,但你通过了const char*。那么编译器的作用是:

std::string filenameParam = "hello"; // construct a new object 
function(filenameParam); 

就像前面的例子,但是这一次却是希望更清楚,我们正在建造一个临时对象。

注意:调用它们“somethingParam”的惯例只是为了清楚地说明这个答案。

对象数组

用户通常要创建同一个类的多个对象,可以创建独立对象变量,也可以创建对象数组:

Stock mystuff[4];

当程序创建未被显式初始化的类对象时,总是调用默认构造函数,可以用构造函数来初始化数组元素,这种情况下,必须为每个元素调用构造函数:

const int STKS = 4;
Stock stock[STKS] = {
    Stock("NanoSmart",12.5,20),
    Stock("Boffo Objects",200,2.0),
    Stock("Monolithic Obelisks",130,3.25),
    Stock("Fleep Enterprises",60,6.5)
};

这里的代码使用标准格式对数组进行初始化:用括号括起来的、以逗号分隔的值列表,括号里面的每个对象都是临时对象,然后将值复制给数组元素

初始化对象数组的方案是

  1. 首先使用默认构造函数创建数组元素
  2. 然后花括号中的构造函数将创建临时对象
  3. 然后将临时对象的内容复制到相应的元素中

因此,要创建类对象数组,则这个类必须有默认构造函数

 

C++中&与&&  

https://tlanyan.me/and-operator-in-cpp/

https://aillieo.cn/post/2017-10-08-cpp-rvalue-references-and-move-semantics/

https://wudaijun.com/2015/03/cpp-rvalue-referrence/

https://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

 

更多"临时对象","返回值优化",“右值引用”深入阅读:

https://devblogs.microsoft.com/cppblog/rvalue-references-c0x-features-in-vc10-part-2/

http://www.cppblog.com/kesalin/archive/2009/05/28/85983.html    (上文译文)

https://www.bbsmax.com/A/q4zV0Ejj5K/

https://hackmd.io/s/BynCMibnW

https://www.zfl9.com/cpp-oop.html

https://juejin.im/post/5dcaa444518825573608e442

http://blog.guorongfei.com/2016/03/16/cppx-stdlib-empalce/

http://blog.guorongfei.com/2016/02/05/cpp-gurues-blogs/

http://simtalk.cn/2017/01/02/Cpp-in-Caffe/

https://blog.csdn.net/k346k346/article/details/45652219

https://www.cnblogs.com/daocaoren/archive/2011/07/19/2110258.html

https://liam.page/2016/12/11/rvalue-reference-in-Cpp/

https://www.qiujiawei.com/cpp-4/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值