C++中的复制构造函数
2024-08-30 02:45:45
与C++中的构造函数相同,复制构造函数在对象生成过程中同样进行插入对应的Vtable虚表,但在成员变量赋值时,除具有复制构造函数的成员对象外,编译器合成复制构造函数其余均采用”Bitwise copy semantics(位逐次拷贝)”语义实现对象成员的拷贝,无论处于何种语境。测试代码如下:
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring> using namespace std; class A {
private:
char *str;
int len;
public:
A(const string &str) {
this->str = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str,str.c_str(),len);
cout << "A()" << endl;
} A(const A&a) {
if(this != &a) { if(this->str) delete this->str; string str(a.str);
this->str = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str,str.c_str(),len);
cout << "A(const A &a)" << endl;
}
} ~A() {
delete str;
str = NULL;
cout << "~A()" << endl;
}
}; class B {
private:
char *str;
int len;
string str_;
public:
B(const string &str) {
this->str = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str,str.c_str(),len);
cout << "B()" << endl;
} ~B() {
delete str;
cout << "~B()" << endl;
}
}; class C:public A {
private:
char *str_;
int len;
public:
C(const string &str):A(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "C()" << endl;
} ~C() {
delete str_;
cout << "~C()" << endl;
}
}; class D {
private:
char *str_;
int len;
public:
D(const string &str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "D()" << endl;
} ~D() {
delete str_;
cout << "~D()" << endl;
} virtual void fun() {
cout << "D::fun()" << endl;
} }; class E:public virtual D { private:
char *str_;
int len;
public:
E(const string &str):D(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "E()" << endl;
} ~E() {
delete str_;
cout << "~E()" << endl;
} virtual void fun() {
cout << "E::fun()" << endl;
}
}; class F:public virtual D { private:
char *str_;
int len;
public:
F(const string &str):D(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "F()" << endl;
} ~F() {
delete str_;
cout << "~F()" << endl;
} virtual void fun() {
cout << "F::fun()" << endl;
}
}; class G:public E,public F { private:
char *str_;
int len;
public:
G(const string &str):E(str),F(str),D(str) {
this->str_ = (char *)(malloc(sizeof(char) * str.size()));
len = str.size();
memcpy(this->str_,str.c_str(),len);
cout << "G()" << endl;
} ~G() {
delete str_;
cout << "~G()" << endl;
} virtual void fun() {
cout << "G::fun()" << endl;
}
}; void fun(D *d)
{
d->fun();
} //static A a("classA");
//static B b("classB");
//static C c("classC");
//static E e("classE");
static G g("classG");
int main(int argc, char *argv[])
{
//A a1 = a;
//B b1 = b;
//C c1 = c;
//E d1 = e;
E e1 = g;
F f1 = g;
fun(&e1);
fun(&f1);
//fun(&g);
return 0;
}
上面分别测试单继承,多继承,无继承,多态各种情况下,g++编译器合成复制构造函数的语义执行情况,未提供复制构造函数类成员均为”Bitwise Copy Semantics”语义,多态特性不受影响。
D()
E()
F()
G()
E::fun()
F::fun()
~F()
~D()
~E()
~D()
~G()
~F()
~E()
~D()
最新文章
- ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。
- JS中try....catch
- NSAssert的使用
- InitGoogleLogging坑爹
- NSDateFormatter 格式说明
- 屏幕录像专家V7.5(完美破解版,无水印)下载
- the process cannot access the file because it is being used by another process
- jstack jstat 简易使用教程
- 识别你的ADFS是什么版本的(Which version of ADFS is running)
- vi 常用命令使用說明
- ubuntu远程windows桌面
- 并行开发-Task
- idea中springboot项目程序入口右键不显示run as的原因
- [转帖] .NET FrameWork 版本的确定方法
- 数论知识点总结(noip范围)
- iOS 开发笔记 - 开发中如何实现自动检测更新APP
- SoapUI利用Groovy对response与断言的处理
- Delphi Webbrowser使用方法详解(一)
- WebApi参数问题方案
- python 面向对象 字典 有序字典
热门文章
- 制作登录界面,登录成功后把用户名放在session里,在第3个页面读取session显示用户名
- VB.NET中的除法运算符 与 C#中的除法运算符
- 移植linux-2.6.32.2到qq2440
- HDU-4522 湫湫系列故事——过年回家 最短路
- jQuery核心之jQuery Object及其相关的常用方法
- php总结 --- 4. 对象
- fsimage 和 edits log
- 20161025__Oracle10g双机备份
- [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
- 用sqlplus为oracle创建用户和表空间<;转>;