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="" ...
随机推荐
- 14.2.5.4 Physical Structure of an InnoDB Index InnoDB Index 的物理结构
14.2.5.4 Physical Structure of an InnoDB Index InnoDB Index 的物理结构 所有的InnoDB indexes 是B-trees ,index ...
- java Date 和 javascript Date
近期写一个页面.上面要展示下日期. 在Java中生成了Date.然后将这个Date通过velocity送入vm模板其中 代码例如以下: var dates = new Date("$!{pp ...
- JSP的include指令
JSP的include 指令:向当前页面中插入的一个静态文件的内容. 在test5.jsp里面 <%@ include file="test5_1.jsp" %> 新建 ...
- 中国大概可用NTPserver地址
133.100.11.8 prefer210.72.145.44203.117.180.36131.107.1.10time.asia.apple.com64.236.96.53130.149.17. ...
- AVOS_百度百科
AVOS_百度百科 AVOS 目录 公司产品 AVOS 是 YouTube 创始人 Chad Hurley 和 Steve Chen(陈士骏)创立的互联网公司. 编辑本段公司产品 产品包括 ...
- 更改Oracle实例的字符集
(1).数据库服务器字符集select * from nls_database_parameters 来源于props$,是表示数据库的字符集. (2).服务端字符集环境select * from n ...
- java泛型 之 入门(interface)
一:泛型简单介绍: (1)所谓泛型,就是变量类型的參数化. 泛型是JDK1.5中一个最重要的特征.通过引入泛型,我们将获得编译时类型的安全和执行时更小的抛出ClassCastException的可能. ...
- 西南民大oj(递推)
我的数学不可能那么难推 时间限制(普通/Java) : 3000 MS/ 9000 MS 运行内存限制 : 65536 KByte总提交 : 49 测试通过 : ...
- Codeforces 452A Eevee
#include<bits/stdc++.h> using namespace std; string m[]={"vaporeon","jolteon&qu ...
- 前端控件之Jquery datetimepicker的使用总结
效果图 在介绍jquery datetimepicker的使用方法前,我们先来看一下它的实现效果图,这样以便让你更快地了解它是否是你所需要的. 下面我截了四张常用的效果图(截取自http://xdso ...