C++实例分析讲解临时对象与右值引用的用法
简介
在C++中,临时对象是指在语句执行过程中,根据需要临时创建的匿名对象,这种临时对象在表达式结束时自动销毁。右值引用是C++11新特性,定义了新的类型修饰符&&,表示一个右值引用,可以用来引用临时对象。
临时对象
示例1
#include<iostream>
using namespace std;
class point
{
public:
int x, y;
point(int x = 0, int y = 0):x(x), y(y){}
point(const point &p):x(p.x), y(p.y)
{
cout << "Copy constructor called" << endl;
}
};
point getpoint() // 返回临时对象
{
point p(1, 2);
return p;
}
int main()
{
point p = getpoint();
return 0;
}
在上述代码中,getpoint函数返回一个point类型的临时对象。在main函数中,定义了一个point类型的变量p,并将getpoint函数返回的临时对象赋值给p,此时会调用point类的复制构造函数,将临时对象中的数据拷贝到p中。程序的执行结果为:
Copy constructor called
示例2
#include<iostream>
using namespace std;
class integer
{
public:
int a;
integer(int x = 0) :a(x){}
integer operator+(const integer &b) const // 定义运算符重载函数
{
integer c(a + b.a);
return c;
}
};
int main()
{
integer a(1), b(2), c;
c = a + b;
cout << c.a << endl;
return 0;
}
在上述代码中,定义了一个integer类,其中重载了+操作符。在main函数中,定义了3个integer类型的变量a,b和c,其中c通过a+b运算获得。在运算时,会调用integer类的operator+函数,该函数返回一个临时对象,表示a和b相加的结果。最终,临时对象会被赋值给c,此时会调用integer类的复制构造函数,将临时对象中的数据拷贝到c中。程序的执行结果为:
3
右值引用
在C++11中,可以使用右值引用来引用临时对象,以提高程序的效率。
示例1
#include<iostream>
using namespace std;
class point
{
public:
int x, y;
point(int x = 0, int y = 0) :x(x), y(y){}
};
point &&getpoint() // 返回右值引用
{
point p(1, 2);
return move(p); // 返回p的右值引用,并将p变为无效状态
}
int main()
{
point &&p = getpoint(); // 获取右值引用
cout << p.x << " " << p.y << endl;
return 0;
}
在上述代码中,getpoint函数返回一个point类型的右值引用,表示函数返回的是一个临时对象。在main函数中,定义了一个point类型的右值引用p,并将getpoint函数返回的右值引用赋值给p。程序的执行结果为:
1 2
示例2
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 3; ++i)
{
v.push_back(i);
}
for (auto &&i : v) // 使用右值引用遍历vector
{
cout << i << " ";
}
cout << endl;
return 0;
}
在上述代码中,定义了一个vector
0 1 2
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实例分析讲解临时对象与右值引用的用法 - Python技术站