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. Java线程并发中常见的锁--自旋锁 偏向锁

    随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想 ...

  2. 8086 CPU 寻址方式

    8086 CPU 寻址方式灵活.有以下几种 idata 表示常量 1.   [ idata ] 用一个常量来表示地址,可用于直接定位内存单元,但是在 MASM中要显实在的说明 ds 段寄存器, 比如 ...

  3. Tomcat 配置WEB虚拟映射 及 配置虚拟主机

    Tomcat  配置WEB虚拟映射 及 配置虚拟主机 配置WEB虚拟映射文件夹有三种方法例如以下: 第一(要重新启动server的): 打开路径 Tomcat 6.0\conf 下的 server.x ...

  4. Open Source RTOS

    http://www.osrtos.com/     Name License Platforms Description Last updated FreeRTOS Modified GPL MSP ...

  5. 基于飞思卡尔i.MX 6Quad Sabrelite开发板的触摸屏调试

    1      概述 本次任务是在飞思卡尔i.MX 6Quqd Sabrelite开发板上调试触屏驱动,触屏芯片是Goodix的gt828芯片,触屏接口是I2C. 操作系统:android 4.0.4 ...

  6. java 显示目录下全部文件

    package gao.org; import java.awt.HeadlessException; import java.io.File; import javax.swing.JFileCho ...

  7. git版本号回滚

    先说今天遇到的问题,看到一个config.php的配置文件一直在改动的状态下,可是和远程的config.php是不一致的,我不须要提交它,可是看它在 modified的状态下,非常不爽.想删除它.gi ...

  8. cocos2dx之lua项目开发中MVC框架的简单应用

    **************************************************************************** 时间:2015-03-31 作者:Sharin ...

  9. C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

    上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇 ...

  10. POJ 3415 Max Sum of Max-K-sub-sequence (线段树+dp思想)

    Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...