C++继承中的对象构造与析构和赋值重载实例分析
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本文小编为大家详细介绍"C++继承中的对象构造与析构和赋值重载实例分析",内容详细,步骤清晰,细节处理妥当,希望这篇"C++继承中的对象构造与析构和赋值重载实例分析"文章能帮助大家解决疑惑,下面跟着小
千家信息网最后更新 2025年02月02日C++继承中的对象构造与析构和赋值重载实例分析
本文小编为大家详细介绍"C++继承中的对象构造与析构和赋值重载实例分析",内容详细,步骤清晰,细节处理妥当,希望这篇"C++继承中的对象构造与析构和赋值重载实例分析"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
一、构造/析构顺序及继承性
class A{private: int _a;public: A(int a = 0): _a(a) { cout << "A()" << this << endl; } ~A() { cout << "~A()"<< this <结论:
1.构造顺序:先构造基类,后构造派生类
2.析构顺序:先析构派生类,后析构基类
二、拷贝构造的继承性
class A{private: int _a;public: A(int a = 0): _a(a) { cout << "A()" << this << endl; } A(const A& src): _a(src._a) { cout << "A(const A& src)"<< this << endl; } ~A() { cout << "~A()"<< this <结论:
1.先调用基类缺省的构造函数,后调用派生类的拷贝构造函数
2.若派生类没有缺省构造函数A(),就会报错
疑惑:如何去调用基类的拷贝构造而不是缺省构造
#includeusing namespace std;class A{private: int _a;public: A(int a = 0) : _a(a) { cout << "A()" << this << endl; } A(const A& src) : _a(src._a) { cout << "A(const A& src)" << this << endl; } ~A() { cout << "~A()" << this << endl; }};class B : public A{private: int _b;public: B(int b) : _b(b), A() { cout << "B()" << this << endl; } B(const B& src) : _b(src._b), A(src) //发生赋值兼容规则(切片) { cout << "B(const B& src)" << this << endl; } ~B() { cout << "~B()" << this << endl; }};int main(){ B b(10); B b1(b); return 0;} 结果:
将B类型src传递给A类型的A(const A& src)拷贝构造函数,发生了赋值兼容规则(切片现象)
三、赋值重载不具有继承性
#includeusing namespace std;class A{private: int _a;public: A(int a = 0) : _a(a) { cout << "A()" << this << endl; } A(const A& src) : _a(src._a) { cout << "A(const A& src)" << this << endl; } A& operator=(const A& src) { if(this != &src) { _a = src._a; cout << "A& operator=(const A& src)" << endl; } } ~A() { cout << "~A()" << this << endl; }};class B : public A{private: int _b;public: B(int b) : _b(b), A() { cout << "B()" << this << endl; } B(const B& src) : _b(src._b), A(src) //发生赋值兼容规则(切片) { cout << "B(const B& src)" << this << endl; } B& operator=(const B& src) { if(this != &src) { _b = src._b; cout << "B& operator=(const B& src)" << endl; } } ~B() { cout << "~B()" << this << endl; }};int main(){ B b1(10); B b2(20); b1 = b2; return 0;} 结论:默认情况下仅仅调用了派生类的对象的赋值重载,并未调用基类的赋值重载。
解决方案:
#includeusing namespace std;class A{private: int _a;public: A(int a = 0) : _a(a) { cout << "A()" << this << endl; } A(const A& src) : _a(src._a) { cout << "A(const A& src)" << this << endl; } A& operator=(const A& src) { if(this != &src) { _a = src._a; cout << "A& operator=(const A& src)" << endl; } } ~A() { cout << "~A()" << this << endl; }};class B : public A{private: int _b;public: B(int b) : _b(b), A() { cout << "B()" << this << endl; } B(const B& src) : _b(src._b), A(src) //发生赋值兼容规则(切片) { cout << "B(const B& src)" << this << endl; } B& operator=(const B& src) { if(this != &src) { *(A*)this = src; //将调用基类赋值重载 _b = src._b; cout << "B& operator=(const B& src)" << endl; } } ~B() { cout << "~B()" << this << endl; }};int main(){ B b1(10); B b2(20); b1 = b2; return 0;} 读到这里,这篇"C++继承中的对象构造与析构和赋值重载实例分析"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
对象
函数
拷贝
规则
实例
实例分析
C++
分析
文章
结论
继承性
顺序
内容
类型
妥当
思路
情况
新知
方案
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
博彩软件开发需要多少人
杭州西奥服务器运行次数设置
传统磁盘数据库的优点
网游代理服务器
适合数据库型网站的服务器
乐健体育服务器连接失败
网络云服务器哪家好
石家庄软件开发首选驰宇网络
网络安全巨头 18年利润
飙酷车神2服务器修复
excle导入关联数据库
我想学做软件开发
网络安全专业是青春饭吗
厦门软件开发收入怎么样
破坏网络安全是什么罪
数据库数据模型怎么写
无线网络技术特征
数据库企业管理工具下载
数据库工资发放系统实践报告
化合物谱图数据库查询
结婚典礼视频软件开发
传奇服务器如何关闭
软件开发流程八个流程
服务器电源线可以缠绕吗
有感网络安全和信息化会议
江西标准软件开发代理价钱
数据库 sa 登陆密码
惠普笔记本电脑服务器
杭州促牛网络技术有限公司
传奇3服务器管理工具下载