C++学习-派生类的复制运算符
来源:互联网 发布:linux 启动器 编辑:程序博客网 时间:2024/06/06 02:38
派生类的赋值控制函数
派生类构造函数在其初始化阶段不仅要初始化类自己的成员,还负责初始化派生类对象的基类部分。因此,派生类的复制控制函数在复制自有成员的同时,也要复制基类部分的成员。类似的,如果派生类的赋值运算符没有处理基类的相应的部分,则派生类中基类的部分会采用默认值,请看下面的程序
#include <iostream>using namespace std;class Base{public: Base() { p1 = new int; *p1 = 1; cout << "Base::Base()" << endl; } ~Base() { delete p1; cout << "Base::~Base()" << endl; } Base& operator=(const Base &b) { cout << "Base::operator=()" << endl; p1 = new int; *p1 = *b.p1; return *this; } int *p1;};class Derived : public Base{public: Derived() { p2 = new int; *p2 = 2; cout << "Derived::Derived()" << endl; } ~Derived() { delete p2; cout << "Derived::~Derived()" << endl; }Derived & operator=(Derived &d) { cout << "Derived::operator=()" << endl; p2 = new int; *p2 = *d.p2; return *this;} int *p2;};int main(void){ Derived d; *d.p1 = 3; *d.p2 = 4; cout << "d.p1: " << *d.p1 << endl; cout << "d.p2: " << *d.p2 << endl;//Derived d2 = d; //注意:此时调用的不是赋值运算符,而是d2的复制构造函数!!!Derived d2;d2 = d; cout << "d2.p1: " << *d2.p1 << endl; cout << "d2.p2: " << *d2.p2 << endl; *d2.p1 = 5; *d2.p2 = 6; cout << endl; cout << "d.p1: " << *d.p1 << endl; cout << "d.p2: " << *d.p2 << endl; cout << "d2.p1: " << *d2.p1 << endl; cout << "d2.p2: " << *d2.p2 << endl; return 0;}输出结果为:
在没有给d2中的p1和p2重新赋值前,d2的*p1为1而不是为3,显然和我们想要的结果不一致。。。
派生类的赋值运算符也必须地显式为基类部分赋值:
//Base::operator=(const Base&)不会被自动调用Derived &Derived::operator=(const Derived &d){Base::operator=(d); //为基类部分赋值p2 = new int; *p2 = *d.p2;return *this;}
更改后的完整程序:
#include <iostream>using namespace std;class Base{public: Base() { p1 = new int; *p1 = 1; cout << "Base::Base()" << endl; } ~Base() { delete p1; cout << "Base::~Base()" << endl; } Base& operator=(const Base &b) { cout << "Base::operator=()" << endl; p1 = new int; *p1 = *b.p1; return *this; } int *p1;};class Derived : public Base{public: Derived() { p2 = new int; *p2 = 2; cout << "Derived::Derived()" << endl; } ~Derived() { delete p2; cout << "Derived::~Derived()" << endl; }Derived & operator=(Derived &d) { cout << "Derived::operator=()" << endl; p2 = new int; *p2 = *d.p2; return *this;} int *p2;};int main(void){ Derived d; *d.p1 = 3; *d.p2 = 4; cout << "d.p1: " << *d.p1 << endl; cout << "d.p2: " << *d.p2 << endl;//Derived d2 = d; //注意:此时调用的不是拷贝控制函数,而是d2的默认复制构造函数Derived d2;d2 = d; cout << "d2.p1: " << *d2.p1 << endl; cout << "d2.p2: " << *d2.p2 << endl; *d2.p1 = 5; *d2.p2 = 6; cout << endl; cout << "d.p1: " << *d.p1 << endl; cout << "d.p2: " << *d.p2 << endl; cout << "d2.p1: " << *d2.p1 << endl; cout << "d2.p2: " << *d2.p2 << endl; return 0;}这样就和我们想要的结果一致了
参考:
1、《C++ Prime》 第5版 15.7 构造函数与拷贝控制
0 0
- C++学习-派生类的复制运算符
- 派生类的复制构造函数与赋值运算符
- C++:类的复制构造函数、赋值运算符
- 派生类的赋值运算符也必须处理它的基类成员的赋值(源自effictive c++)
- C++派生类的复制控制
- OBJ-C类的继承和派生学习笔记
- [c++]派生类的应用
- C++: 类的继承派生
- 派生类的构造函数和复制控制
- C++派生类的构造函数和复制控制
- C++中基类与派生类的复制控制
- C++派生类的构造函数和复制控制函数
- C++之派生类的拷贝构造与赋值运算符重载
- C语言类的继承和派生
- [c++]派生类的访问控制
- C++__类模板的派生
- c++派生,运算符重载,虚函数的使用
- 【学习C++】继承与派生
- Java的常用类String 05
- java 10进制与16进制的转换
- Android入门(15)——使用ProgressBar实现进度条
- SSL/TLS 协议详解【基于key的对称加密和不对称加密、不基于key的】
- aop—面向切面编程
- C++学习-派生类的复制运算符
- 【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串】
- 开始玩hadoop9--最后步骤(简单安装Hbase 和 zookeeper 的入门)
- 数字证书及CA的扫盲介绍
- “/XXXX”应用程序中的服务器错误。说明: 在分析向此请求提供服务所需资源时出错。请检查下列特定分析错误详细信息并适当地修改源文件。
- SSL与TLS的区别以及介绍
- linux 链接ln的使用 创建和删除符号连接(软、硬链接)
- LeetCode Convert Sorted List to Binary Search Tree
- APACHE如何里一个站点绑定多个域名?用ServerAlias