C++ 复制功能

说C++复制功能,它可能不是很熟悉。类中的拷贝构造函数和赋值操作符。可是其实或许我们一不小心就会忽略编译器所做的一些默认操作。引起晦涩的错误。以下分析几种场景:

一、场景一:所有默认

#include<stdio.h>
class base{
public:
base(){}
base(int dt):data(dt){}
void get(){printf("base::data = %d\n",data);}
public:
int data;
};
class derived:public base{
public:
derived(){}
derived(int dt,int ddt):base(dt),ddata(ddt){}
void get()
{
base::get();
printf("derived::ddata = %d\n",ddata);
}
private:
int ddata;
};
int main()
{
derived da(1,5);
derived db(2,10);
da.get();
db.get(); da = db;
da.get();
db.get(); derived dc(da);
dc.get(); base ba(da);
ba.get();
getchar();
}

结果:

假设在编译器中执行程序,我们知道,当调用复制函数是。除了派生类的成员被复制外。基类的成员也被复制。这是编译器的行为,当用户未定义复制行为时,编译器就会主动提供一个默认版本号同一时候在须要的时候悄悄的调用完毕复制工作。

场景二、基类默认,派生类自己定义

#include<stdio.h>
class base{
public:
base(){}
base(int dt):data(dt){}
void get(){printf("base::data = %d\n",data);}
public:
int data;
};
class derived:public base{
public:
derived(){}
derived(int dt,int ddt):base(dt),ddata(ddt){}
derived(const derived&d)
{
printf("call derived::copy construct function.\n");
ddata = d.ddata;
}
derived& operator=(const derived&d)
{
printf("call derived::operator= function.\n");
ddata = d.ddata;
return *this;
}
void get()
{
base::get();
printf("derived::ddata = %d\n",ddata);
}
private:
int ddata;
};

结果:

从结果能够看出,当用户定义了复制函数时。一切默认行为就不会发生,即派生类中不会隐式调用基类的默认复制函数。

场景三、基类自己定义,派生类默认

#include<stdio.h>
class base{
public:
base(){}
base(int dt):data(dt){}
base(const base&b)
{
printf("call base::copy construct function.\n");
data = b.data;
}
base& operator=(const base&d)
{
printf("call base::operator= function.\n");
data = d.data;
return *this;
}
void get(){printf("base::data = %d\n",data);}
public:
int data;
}; class derived:public base{
public:
derived(){}
derived(int dt,int ddt):base(dt),ddata(ddt){}
void get()
{
base::get();
printf("derived::ddata = %d\n",ddata);
}
private:
int ddata;
};

结果:

从结果能够看出。当派生类没有显示定义复制函数时,那么他就会调用默认的复制函数,而默认复制函数会自己主动调用基类的复制函数。

场景四、基类派生类都自己定义

#include<stdio.h>
class base{
public:
base(){}
base(int dt):data(dt){}
base(const base&b)
{
printf("call base::copy construct function.\n");
data = b.data;
}
base& operator=(const base&d)
{
printf("call base::operator= function.\n");
data = d.data;
return *this;
}
void get(){printf("base::data = %d\n",data);}
public:
int data;
}; class derived:public base{
public:
derived(){}
derived(int dt,int ddt):base(dt),ddata(ddt){}
derived(const derived&d):base(d)
{
printf("call derived::copy construct function.\n");
ddata = d.ddata;
}
derived& operator=(const derived&d)
{
printf("call derived::operator= function.\n");
ddata = d.ddata;
return *this;
}
void get()
{
base::get();
printf("derived::ddata = %d\n",ddata);
}
private:
int ddata;
};

结果:

从结果看出,仅仅要定义了派生类的复制函数,那么就不会隐式调用基类的复制函数。

结论:仅仅要派生类定义了复制函数,那么就不会隐式调用基类的复制函数,所以在这样的情况下。我们必须显示调用基类的复制函数,以免造成复制的不完整。

以下给出显示调用的样例:

class base{
public:
base(){}
base(int dt):data(dt){}
base(const base&b)
{
printf("call base::copy construct function.\n");
data = b.data;
}
base& operator=(const base&d)
{
printf("call base::operator= function.\n");
data = d.data;
return *this;
}
void get(){printf("base::data = %d\n",data);}
public:
int data;
}; class derived:public base{
public:
derived(){}
derived(int dt,int ddt):base(dt),ddata(ddt){}
derived(const derived&d):base(d)
{
printf("call derived::copy construct function.\n");
ddata = d.ddata;
}
derived& operator=(const derived&d)
{
printf("call derived::operator= function.\n");
base::operator=(d);
ddata = d.ddata;
return *this;
}
void get()
{
base::get();
printf("derived::ddata = %d\n",ddata);
}
private:
int ddata;
};

结果:



C++ 复制功能的更多相关文章

  1. 使用Java的多线程和IO流写一个文件复制功能类

    创建一个复制功能类,继承Thread类,重写run()方法,把FileInputStream和FileOutputStream输入输出流写在run()方法内.示例代码如下: import java.i ...

  2. 现在不使用ZeroClipboard我们也能实现复制功能(转)

    现在不使用ZeroClipboard我们也能实现 首先,我们保证页面结构不变,但不在引入ZeroClipboard插件: 1 <input type="text" name= ...

  3. MSSQL复制功能实现与Oracle数据库同步

    1.分别建立链接对数据库进行操作,SQLServer可以用ADO.NET,操作Oracle可以用OLEDB或者用System.Data.OracleClient(需要添加引用才能用) 这种方案的优点就 ...

  4. 配置Memcache服务器并实现主从复制功能(repcached)(转)

    1.repcached介绍repcached 是日本人开发的实现memcached复制功能,它是一个单 master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步 ...

  5. js兼容各个浏览器的复制功能

    看似简单的复制功能,用js做起来竟然遇到各种情况.刚开始在网上搜索到复制功能的几种实现方法,但是都不兼容.最后还是用的插件代码如下 html模板 <tr> <td>1</ ...

  6. js写的复制功能,只支持IE

    如果用js写,只能支持IE,如果想全支持,需要用jQuery的插件:jquery.zclip.js 下面是用js写的: var copyHref = function(){               ...

  7. js 完美兼容浏览器的复制功能

    1,js结合swf的复制功能,完美兼容火狐,谷歌,360,ie8,使用示例:(ps:引入copy.swf比较重要,文件传送门 解压密码:http://www.bieanju.com/,为了防止360删 ...

  8. JavaScript实现复制功能

    这两天在做Web前端时,遇到需求通过 js 实现文本复制的功能. 先不考虑浏览器的兼容性,看看各浏览器对复制功能的支持情况: 1.IE浏览器 ,解决方法有三种,代码如下: function copy( ...

  9. 禁止页面复制功能 js禁止复制 禁用页面右键菜单

    <body oncontextmenu="return false">禁用网页右键菜单,但是仍然可以使用快捷键复制. js代码禁用复制功能: <script  t ...

  10. ZeroClipboard插件:兼容各浏览器网页复制功能

    常规利用JS编写的网页复制功能只对IE有效,无法做到兼容其它浏览器,代码如下: function copyToClipBoard(){ var clipBoardContent="" ...

随机推荐

  1. 【deep learning学习笔记】注释yusugomori的LR代码 --- 模型测试

    测试部分代码: void test_lr() { srand(0); double learning_rate = 0.1; double n_epochs = 500; int train_N = ...

  2. Please verify you invoked Maven from the correct directory

    解决办法: 在cmd中,把当前路径转换到一个含有pom文件的 项目路径下 再使用 类似下面的deploy就行 mvn deploy:deploy-file -DgroupId=com.taobao.n ...

  3. 网络数据(socket)传输总结

    环境限定:TCP/IP下的socket网络传输:C/C++开发语言,32/64位机. 目前有两种方式对数据进行传输:1)字符流形式,即将数据用字符串表示:2)结构型方式,即将数据按类型直接传输. 1) ...

  4. Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋

    Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋 Common Lisp学习笔记(0):从SLIME开始

  5. c中使用malloc动态申请二维数组

    前言 今天写代码的时候,想要动态的申请一个二维数组空间,思索了一段时间才写出来,这里记录一下吧,以后就不至于再浪费时间了.下面以申请int型数组作为例子: 申请一维数组 一维数组的数组名可以看成数组起 ...

  6. oc深坑測试题及其答案

    一.选择题(共80题,每题1分) 1. 不会立马使引用计数器改变的是: 答案:(C)  A.release  B.alloc  C.autorelease  D.retain 2. 在OC中类的接口声 ...

  7. Extjs学习----------动态载入js文件(减轻浏览器的压力)

    动态载入js文件能够减轻浏览器的压力,本例使用了Ext.window.Window组件,该组件的学习地址:http://blog.csdn.net/z1137730824/article/detail ...

  8. ZOJ 3542 2011大连现场赛D题(简单模拟)

    Hexadecimal View Time Limit: 2 Seconds       Memory Limit: 65536 KB Hexadecimal is very important an ...

  9. PCI 总线学习笔记

    转载请注明出处:http://blog.csdn.net/lg2lh/article/details/8042008 PCI的基本协议这里就不介绍了,由于一般的芯片协议都是集成好的,我仅仅须要大体了解 ...

  10. WinCE隐藏显示任务栏,当任务栏隐藏时将其显示,当任务栏显示时将其隐藏(FindWindow,ShowWindow,IsWindowVisible),

    HANDLE hWndTaskBar = ::FindWindow(TEXT("HHTaskBar"), NULL);  if(::IsWindowVisible(hWndTask ...