有关bitwise copy的理解(个人理解,有错误请指出,谢谢)
如果class没有提供一个explict copy constructor,当class object以"相同class的另一个object"作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member的值,从某一个对象拷贝一份到另外一个对象上。不过它并不会拷贝其中的member class object,而是以递归的方式施行memberwise initialization(递归的意思是不调用member class 的copy constructor去复制member class object的值,而是以member class 内小单元的data进行小规模复制)
程序1:
class A
{
public:
int i;
A(){i=0;}
};
int main()
{
A a;
cout<<a.i<<endl;
A a1 = a;//调用内部的default memberwise initialization手法进行复制
cout<<"--------"<<endl;
cout<<a1.i<<endl;
return 0;
}
{
public:
int i;
A(){i=0;}
};
int main()
{
A a;
cout<<a.i<<endl;
A a1 = a;//调用内部的default memberwise initialization手法进行复制
cout<<"--------"<<endl;
cout<<a1.i<<endl;
return 0;
}
相当于a1.i = a.i;
程序2:
但是如果在类的内部有其他类类型的情况就有所不同了:
class B //Without copy-constructor
{
public:
int j;
char c;
B(){j=2;c='B';}
};
{
public:
int j;
char c;
B(){j=2;c='B';}
};
class A
{
public:
int i;
B b;
A(){i=0;}
};
int main()
{
A a;
cout<<a.i<<endl;
cout<<a.b.j<<endl;
cout<<a.b.c<<endl;
A a1 = a;
cout<<"--------"<<endl;
cout<<a1.i<<endl;
cout<<a1.b.j<<endl;
cout<<a1.b.c<<endl;
return 0;
}
{
public:
int i;
B b;
A(){i=0;}
};
int main()
{
A a;
cout<<a.i<<endl;
cout<<a.b.j<<endl;
cout<<a.b.c<<endl;
A a1 = a;
cout<<"--------"<<endl;
cout<<a1.i<<endl;
cout<<a1.b.j<<endl;
cout<<a1.b.c<<endl;
return 0;
}
相当于:
a1.i = a.i;
a1.b.j=a.b.j;
a1.b.c=a.b.c;(对b进行递归复制)
输出结果:
0
2
B
-----------
0
2
B
2
B
-----------
0
2
B
程序3:
如果类B有explict copy constructor,情况就又不一样了:
class B
{
public:
int j;
char c;
B(){j=2;c='B';}
B(const B&){j=3;c='c';cout<<"B::copyconstructor"<<endl;} //支持 explict copy constructor
};
{
public:
int j;
char c;
B(){j=2;c='B';}
B(const B&){j=3;c='c';cout<<"B::copyconstructor"<<endl;} //支持 explict copy constructor
};
class A
{
public:
int i;
B b;
A(){i=0;}
};
int main()
{
A a;
cout<<a.i<<endl;
cout<<a.b.j<<endl;
cout<<a.b.c<<endl;
A a1 = a;
cout<<"--------"<<endl;
cout<<a1.i<<endl;
cout<<a1.b.j<<endl;
cout<<a1.b.c<<endl;
return 0;
}
{
public:
int i;
B b;
A(){i=0;}
};
int main()
{
A a;
cout<<a.i<<endl;
cout<<a.b.j<<endl;
cout<<a.b.c<<endl;
A a1 = a;
cout<<"--------"<<endl;
cout<<a1.i<<endl;
cout<<a1.b.j<<endl;
cout<<a1.b.c<<endl;
return 0;
}
相当于:
a1.i = a.i;
a1.b = a.b;(调用了复制构造函数,相当于对b进行整体复制)
输出结果:
0
2
B
B::copyconstructor
--------
0
3
c
2
B
B::copyconstructor
--------
0
3
c
接下来就是编译器在什么情况下会合成一个copy constructor呢?这就得视该class是否展现"bitwise copy semantics"而定,在inside the c++ object model里说的很清楚,在这里就不说了。