基于GCC测试:http://www.tutorialspoint.com/compile_cpp11_online.php
const A& a=fun() 与 A a= fun()
1、方法fun返回值为 const A& 时,前者比后者 减少一次拷贝构造
#include <iostream> using namespace std; class A
{ public: A() {
cout << "--默认构造函数--" << endl;
} A(const A& a) { cout << "--拷贝构造函数--" << endl; } A & operator =(const A &a)
{
cout << "--赋值--" << endl;
return *this;
}
}; class Test
{
public:
const A& GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
A vec;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
const A& b=t.GetA();
cout <<&b << endl;
return ;
}
const &
2、方法fun返回值为 A 时,相同。只会生成一个临时变量
A GetA(){ cout <<&m_a << endl; return m_a;}
A GetA(){ A a;cout <<&a << endl; return a;}
未实现move构造的类:A a=std::move(fun()) 与 A a=fun()
1、方法fun返回值为 const A& 时,相同,都调用一次拷贝构造
class Test
{
public:
const A& GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b=std::move(t.GetA());
cout <<&b << endl;
return ;
}
move
2、方法fun返回值为 A,前者比后者多一次拷贝构造
class Test
{
public:
A GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b=std::move(t.GetA());
cout <<&b << endl;
return ;
}
move
未实现move构造的类:A a;a=std::move(fun()) 与 A a;a=fun()
与fun的返回值无关,均相同
class Test
{
public:
A GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a;
a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b;
b=std::move(t.GetA());
cout <<&b << endl;
return ;
}
赋值
const A& GetA(){ cout <<&m_a << endl; return m_a;}
const A&