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. android解析xml一直报错org.xmlpull.v1.XmlPullParserException

     错误: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT @1:2 injava.io.String ...

  2. Nginx设置alias实现虚拟目录 alias与root的用法区别

    Nginx 貌似没有虚拟目录的说法,因为它本来就是完完全全根据目录来设计并工作的.如果非要给nginx安上一个虚拟目录的说法,那就只有alias标签比较"像",干脆来说说alias ...

  3. Javascript selection的兼容性写法介绍

    本文为大家讲解下Javascript selection的兼容性写法,感兴趣的朋友可以参考下 function getSelectedText() { //this function code is ...

  4. 模拟new实例化对象。

    使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用ne ...

  5. UVA 10622 - Perfect P-th Powers(数论)

    UVA 10622 - Perfect P-th Powers 题目链接 题意:求n转化为b^p最大的p值 思路:对n分解质因子,然后取全部质因子个数的gcd就是答案,可是这题有个坑啊.就是输入的能够 ...

  6. hdu 2594 Simpsons’ Hidden Talents 【KMP】

    题目链接:http://acm.acmcoder.com/showproblem.php?pid=2594 题意:求最长的串 同一时候是s1的前缀又是s2的后缀.输出子串和长度. 思路:kmp 代码: ...

  7. SetDlgItemText控件运行错误

    SetDlgltem函数把一个WM_SETTEXT消息发送到指定的控件. 今天在测试一个小程序,发现使用SetDlgItemText控件编译没问题,但是运行就出错误. 语句为: time=CTime: ...

  8. hdu1217Arbitrage--解题报告

    题意:套利,一个US币换取0.5 British pound,而1 British pound 换取10.0 French francs,同一时候 1 French franc buys 0.21 U ...

  9. 不要打开文件,阅读Rvt信息档案

    叶老师,想问一下是否能基于revit API 2014,直接在开发时传递给程序要处理的文件名称和路径.而不用再在revit软件中打开为当前活动视图,就直接获得文件里信息.这样可行不? 答: 能够.你能 ...

  10. OCP读书笔记(1) - Oracle核心概念和工具

    ohasdoracle high available service daemon OEMweb -- Database Control资料库 -- sysman Starting Oracle Re ...