首页 > 代码库 > C++ 复制函数
C++ 复制函数
C++ 复制函数
说道C++复制函数,大家也许并不陌生,就是类中的拷贝构造函数和赋值操作符,但是事实上也许我们一不小心就会忽略编译器所做的一些默认操作。引起晦涩的错误。下面分析几种场景:
一、场景一:全部默认
#include<stdio.h> class base{ public: base(){} base(int dt):data(dt){} void get(){printf("base::data = http://www.mamicode.com/%d/n",data);}>结果:
如果在编译器中运行程序,我们知道,当调用复制函数是,除了派生类的成员被复制外,基类的成员也被复制。这是编译器的行为,当用户没有定义复制行为时,编译器就会主动提供一个默认版本同时在需要的时候悄悄的调用完成复制工作。
场景二、基类默认,派生类自定义
#include<stdio.h> class base{ public: base(){} base(int dt):data(dt){} void get(){printf("base::data = http://www.mamicode.com/%d/n",data);}>结果:
从结果可以看出,当用户定义了复制函数时,一切默认行为就不会发生,即派生类中不会隐式调用基类的默认复制函数。
场景三、基类自定义,派生类默认
#include<stdio.h> class base{ public: base(){} base(int dt):data(dt){} base(const base&b) { printf("call base::copy construct function.\n"); data = http://www.mamicode.com/b.data;>结果:
从结果可以看出,当派生类没有显示定义复制函数时,那么他就会调用默认的复制函数,而默认复制函数会自动调用基类的复制函数。
场景四、基类派生类都自定义
#include<stdio.h> class base{ public: base(){} base(int dt):data(dt){} base(const base&b) { printf("call base::copy construct function.\n"); data = http://www.mamicode.com/b.data;>结果:
从结果看出,只要定义了派生类的复制函数,那么就不会隐式调用基类的复制函数。
结论:只要派生类定义了复制函数,那么就不会隐式调用基类的复制函数,所以在这种情况下,我们必须显示调用基类的复制函数,以免造成复制的不完整。
下面给出显示调用的例子:
class base{ public: base(){} base(int dt):data(dt){} base(const base&b) { printf("call base::copy construct function.\n"); data = http://www.mamicode.com/b.data;>结果:
C++ 复制函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。