C++ 复制功能
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++ 复制功能的更多相关文章
- 使用Java的多线程和IO流写一个文件复制功能类
创建一个复制功能类,继承Thread类,重写run()方法,把FileInputStream和FileOutputStream输入输出流写在run()方法内.示例代码如下: import java.i ...
- 现在不使用ZeroClipboard我们也能实现复制功能(转)
现在不使用ZeroClipboard我们也能实现 首先,我们保证页面结构不变,但不在引入ZeroClipboard插件: 1 <input type="text" name= ...
- MSSQL复制功能实现与Oracle数据库同步
1.分别建立链接对数据库进行操作,SQLServer可以用ADO.NET,操作Oracle可以用OLEDB或者用System.Data.OracleClient(需要添加引用才能用) 这种方案的优点就 ...
- 配置Memcache服务器并实现主从复制功能(repcached)(转)
1.repcached介绍repcached 是日本人开发的实现memcached复制功能,它是一个单 master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步 ...
- js兼容各个浏览器的复制功能
看似简单的复制功能,用js做起来竟然遇到各种情况.刚开始在网上搜索到复制功能的几种实现方法,但是都不兼容.最后还是用的插件代码如下 html模板 <tr> <td>1</ ...
- js写的复制功能,只支持IE
如果用js写,只能支持IE,如果想全支持,需要用jQuery的插件:jquery.zclip.js 下面是用js写的: var copyHref = function(){ ...
- js 完美兼容浏览器的复制功能
1,js结合swf的复制功能,完美兼容火狐,谷歌,360,ie8,使用示例:(ps:引入copy.swf比较重要,文件传送门 解压密码:http://www.bieanju.com/,为了防止360删 ...
- JavaScript实现复制功能
这两天在做Web前端时,遇到需求通过 js 实现文本复制的功能. 先不考虑浏览器的兼容性,看看各浏览器对复制功能的支持情况: 1.IE浏览器 ,解决方法有三种,代码如下: function copy( ...
- 禁止页面复制功能 js禁止复制 禁用页面右键菜单
<body oncontextmenu="return false">禁用网页右键菜单,但是仍然可以使用快捷键复制. js代码禁用复制功能: <script t ...
- ZeroClipboard插件:兼容各浏览器网页复制功能
常规利用JS编写的网页复制功能只对IE有效,无法做到兼容其它浏览器,代码如下: function copyToClipBoard(){ var clipBoardContent="" ...
随机推荐
- 怎样将baidu地图中的baidu logo 去掉
今天我的老大问我是不是能够将baidumap 的js版中baidu logo 去掉. 我上网查询一下,有各种方法.比方将相应的logo div remove hide 等等,这些都是须要JS 函数触发 ...
- Python爬行动物(一):基本概念
定义网络爬虫 网络爬虫(Web Spider,也被称为网络蜘蛛,网络机器人,也被称为网页追逐者).按照一定的规则,维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁,自己主动索引 ...
- Nancy.Host的Web应用
Nancy.Host实现脱离iis的Web应用 本篇将介绍如何使用Nancy.Host实现脱离iis的Web应用,在开源任务管理平台TaskManagerV2.0代码里面已经使用了Nancy.Host ...
- cocos2dx--两个场景切换各函数调用顺序
场景A切换到场景B,有切换特效 调用顺序例如以下:(AAABABABA) A:构造函数 A:onEnter A:onEnterTransitionDidFinish B:构造函数 A:onExitTr ...
- [Android学习笔记]使用ListView
简单使用ListView 关键在于Adatper Adatper用来连接UI与数据源.Adapter既负责提供数据,又负责创建Item视图. 一般步骤: 1.创建list_item.xml,用来创建L ...
- sort 使用 tab键 作为 分隔符_人生如梦_百度空间
sort 使用 tab键 作为 分隔符_人生如梦_百度空间 sort 使用 tab键 作为 分隔符 For some reason "\t" doesn't work right, ...
- listview改变选中行字体颜色
[android]listview改变选中行字体颜色 目标:选中item,其字体设置为#3197FF,未选中的,其字体为#FFFFFF 与listvew设置选中行item背景图片一样,使用select ...
- 算法 《秦九韶算法java实践》
[历史背景] 秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术.它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorithm ...
- HDU 2444 The Accomodation of Students(推断是否是二分图)
题目链接 题意:n个学生,m对关系,每一对互相认识的能住一个房间.问否把这些学生分成两组,要求每组的学生都互不认识.求最多须要多少个房间. 能否分成两组?也就是说推断是不是二分图,推断二分图的办法,用 ...
- 图像特征提取方法:Bag-of-words
Bag-of-words简单介绍 最初的Bag-of-words ,也叫做"词袋",在信息检索中,Bag-of-words model假定对于一个文本,忽略其词序和语法,句法,将其 ...