#include<iostream>
#include<string>
#include<vector>
using namespace std;
class BoVector {
public:
BoVector(){}
BoVector(const BoVector& rhs) { //Copy constructor 深拷贝
cout << "Copy constructor ..." << endl;
size = rhs.size;
arr_ = new double[size];
for (int i = 0; i < size; i++) {
arr_[i] = rhs.arr_[i];
}
}
BoVector(BoVector &&rhs) { //Move constructor 浅拷贝
cout << "Move constructor ..." << endl;
size = rhs.size;
arr_ = rhs.arr_;
for (int i = 0; i < size; i++)
{
cout << arr_[i] << endl;
}
rhs.arr_ = nullptr;
}
~BoVector() {
delete[] arr_;
}
public:
int size;
double* arr_;
};
void printInt(int& i) { cout << "lvalue reference" << i << endl; }
void printInt(int&& i) { cout << "rvalue reference" << i << endl; }
void func(BoVector &&v) {
cout << "In func" << endl;
for (int i = 0; i < v.size; i++)
{
cout << v.arr_[i] << endl;
}
}
BoVector createBoVector() {
BoVector bo;
double arr_[] = { 1,2,3,4 };
bo.size = 4;
bo.arr_ = new double[bo.size];
for (int i = 0; i < bo.size; i++)
{
bo.arr_[i]= arr_[i];
}
return bo;
}
void fun(BoVector bo) {
cout << "In fun" << endl;
}
int main() {
int a = 5;
printInt(a);
printInt(6);
BoVector bo=createBoVector();//相当于bo(createBoVector()),会调用Move constructor
fun(bo); //bo是左值,会调用Copy constructor
fun(createBoVector());//createBoVector()是右值,会调用 Move constructor
func(createBoVector());
cin.get();
}
也可以使用std::move 调用Move constructor
使用move之后对象立即被销毁!
右值引用通常用于重载Copy constructor,从而避免深拷贝!
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class BoVector {
public:
BoVector(){
printf("constructor....");
}
BoVector(const BoVector& rhs) { //Copy constructor 深拷贝
cout << "Copy constructor ..." << endl;
size = rhs.size;
arr_ = new double[size];
for (int i = 0; i < size; i++) {
arr_[i] = rhs.arr_[i];
}
}
BoVector(BoVector &&rhs) { //Move constructor 浅拷贝
cout << "Move constructor ..." << endl;
size = rhs.size;
arr_ = rhs.arr_;
rhs.arr_ = nullptr;
}
~BoVector() {
delete[] arr_;
}
public:
int size;
double* arr_;
};
void printInt(int& i) { cout << "lvalue reference" << i << endl; }
void printInt(int&& i) { cout << "rvalue reference" << i << endl; }
BoVector createBoVector() {
BoVector bo;
double arr_[] = { 1,2,3,4 };
bo.size = 4;
bo.arr_ = new double[bo.size];
for (int i = 0; i < bo.size; i++)
{
bo.arr_[i]= arr_[i];
}
return bo;
}
void fun(BoVector bo) {
cout << "In fun" << endl;
}
void fun_by_ref(BoVector &bo) {
cout << "In fun by ref ..." << endl;
}
int main() {
BoVector bo=createBoVector();//相当于bo(createBoVector()),会调用Move constructor
printf("fun_by_ref(bo):\n");
fun_by_ref(bo);//No constructor
printf("-----------------\n");
printf("fun(bo):\n");
fun(bo); //Copy constructor
printf("-----------------\n");
printf("fun(createBoVector()):\n");
fun(createBoVector());// Move constructor
printf("-----------------\n");
//fun(std::move(bo));
cin.get();
}
可以看到引用传递并没有调用constructor所以效率高于Move constructor , Move constructor效率高于Copy constructor