首页 > 代码库 > C++ constructor 初始化对象成员最高效的做法
C++ constructor 初始化对象成员最高效的做法
#include <iostream>
#include <utility>
using namespace std;
class A{
private:
int data;//data
int *pi;//point to data
public:
//禁止隐式转换
A(){
data = 0;
pi = &data;
}
~A(){
data = -999999;
pi = nullptr;
}
explicit A(int i) :data(i){
cout << "normal constuctor!" << endl;
pi = &data;
}
A(const A &a){
data = a.data;
cout << "copy constructor!" << endl;
pi = &data;
}
A(A &&a){
cout << "move constructor!" << endl;
//直接移动a.pi到pi
pi = a.pi;
data = a.data; //修改源pi
a.pi = nullptr;
a.data = 0;
}
A operator+(const A &a){
A temp(data + a.data);
cout << endl << "operator+ called!show temp!" << endl;
temp.show();
cout << endl;
return temp;
}
void show()const{
cout << "pi=" << pi << " data=http://www.mamicode.com/" << data << endl;
}
};
class B
{
private:
A _a;
public:
// B(A aa) :_a(aa){
// }//到这里时, aa 和 _a仍然存在!! aa浪费了, 白死了!
//************************ 最高效 ***********************************
B(const A& aa) :_a(aa){
}//利用main中的a复制构造_a, 毫无浪费
//********************* 最高效 *****************************
// B(A aa){
// _a = std::move(aa);//_a白白构造了一遍!
// }
~B(){}
};
//vs可以像Eclipse一样按Tab键!!!!!!!
int main()
{
int i = 99;
A a(10);
B b(a);//复制构造a
}
#include <utility>
using namespace std;
class A{
private:
int data;//data
int *pi;//point to data
public:
//禁止隐式转换
A(){
data = 0;
pi = &data;
}
~A(){
data = -999999;
pi = nullptr;
}
explicit A(int i) :data(i){
cout << "normal constuctor!" << endl;
pi = &data;
}
A(const A &a){
data = a.data;
cout << "copy constructor!" << endl;
pi = &data;
}
A(A &&a){
cout << "move constructor!" << endl;
//直接移动a.pi到pi
pi = a.pi;
data = a.data; //修改源pi
a.pi = nullptr;
a.data = 0;
}
A operator+(const A &a){
A temp(data + a.data);
cout << endl << "operator+ called!show temp!" << endl;
temp.show();
cout << endl;
return temp;
}
void show()const{
cout << "pi=" << pi << " data=http://www.mamicode.com/" << data << endl;
}
};
class B
{
private:
A _a;
public:
// B(A aa) :_a(aa){
// }//到这里时, aa 和 _a仍然存在!! aa浪费了, 白死了!
//************************ 最高效 ***********************************
B(const A& aa) :_a(aa){
}//利用main中的a复制构造_a, 毫无浪费
//********************* 最高效 *****************************
// B(A aa){
// _a = std::move(aa);//_a白白构造了一遍!
// }
~B(){}
};
//vs可以像Eclipse一样按Tab键!!!!!!!
int main()
{
int i = 99;
A a(10);
B b(a);//复制构造a
}
我本来猜想会有move constructor的编译器优化, 不过const &也可以避免多余的构造函数调用, 我想多了
C++ constructor 初始化对象成员最高效的做法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。