要理解临时对象,可能先需要搞清楚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 * c
和b * c
的值,并将它们存储的地方 - 它不能存储他们在a
或b
或c
。所以生成的代码就相当于:
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)
};
这里的代码使用标准格式对数组进行初始化:用括号括起来的、以逗号分隔的值列表,括号里面的每个对象都是临时对象,然后将值复制给数组元素
初始化对象数组的方案是
- 首先使用默认构造函数创建数组元素
- 然后花括号中的构造函数将创建临时对象
- 然后将临时对象的内容复制到相应的元素中
因此,要创建类对象数组,则这个类必须有默认构造函数
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://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/