继承中构造、析构 与 拷贝构造、赋值中的调用区别
2015-01-20 19:23
411 查看
有错误欢迎批评指正!谢谢!
1.当一个类继承另一个类的时候,子类构造函数与析构函数在自己的类中不需要显示调用父类的构造函数与析构函数
2.当一个类继承另一个类的时候,子类的拷贝构造函数需要显示的调用父类的拷贝构造函数,且必须按初始化的方式调用!
3.当一个类继承另一个类的时候,子类的赋值函数也需要显示的调用父类的赋值函数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201401/b63e8dc3a8dc61cc909cdb2f6811c3ee.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201401/8fa8c56fcd3576cf8d1d82a98d9ce9e2.png)
发现this指针不是指向
![](http://blog.csdn.net/u014082714/article/details/file:/D:/Users/huchao/AppData/Local/Temp/SGTpbq/7972/0AAF0499.gif)
p5,指向了一个临时产生的父类对象 后者就是将值赋给真正的父类对象。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201401/1e1572b67270fb2a8c8288c5c1742525.png)
很明显this指针指向
![](http://blog.csdn.net/u014082714/article/details/file:/D:/Users/huchao/AppData/Local/Temp/SGTpbq/7972/0AAF0499.gif)
p5
1.当一个类继承另一个类的时候,子类构造函数与析构函数在自己的类中不需要显示调用父类的构造函数与析构函数
2.当一个类继承另一个类的时候,子类的拷贝构造函数需要显示的调用父类的拷贝构造函数,且必须按初始化的方式调用!
3.当一个类继承另一个类的时候,子类的赋值函数也需要显示的调用父类的赋值函数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
#include<iostream> using namespace std; int i=1; class base{ public: base(){ valueBase=i; i++; valueBase2=i; i++; printf("base create!\n"); } base(base &temp){ valueBase=temp.valueBase; valueBase2=temp.valueBase2; printf("base copy create!\n"); } base& operator =(const base & temp){ valueBase=temp.valueBase; valueBase2=temp.valueBase2; printf("base = operator!\n"); return *this; } ~base(){ printf("delete base!\n"); } int valueBase; int valueBase2; }; class child:public base{ public: child(){ p=new char; *p='0'+i; printf("child create!\n"); } child(child &temp):base(temp){ //base::base(temp); //一定写成上面初始化的方法,否则会有临时变量产生,且父类赋值不正确,其实这样是将值赋给了临时变量而不是正真的父类 p=new char; *p=*temp.p; printf("child copy create!\n"); } child& operator =(const child & temp){ base::operator=(temp); //赋值函数必须显示的调用父类的赋值函数,否则不会去执行父类的赋值函数 *p=*temp.p; printf("child = operator!\n"); return *this; } ~child(){ printf("delete child!\n"); } char *p; }; void fun(){ child p2; child p5(p2); p5=p2; } int main(){ fun(); getchar(); }
为什么?当一个类继承另一个类的时候,子类的拷贝构造函数需要显示的调用父类的拷贝构造函数,且必须按初始化的方式调用! child(child &temp){ base::base(temp); p=new char; *p=*temp.p; printf("child copy create!\n"); }与
child(child &temp):base(temp){ p=new char; *p=*temp.p; printf("child copy create!\n"); }有什么区别?前者将会构造产生一个临时父类对象,且把值赋给这个临时父类对象,而不是正真的父类对象!调试:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201401/b63e8dc3a8dc61cc909cdb2f6811c3ee.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201401/8fa8c56fcd3576cf8d1d82a98d9ce9e2.png)
发现this指针不是指向
![](http://blog.csdn.net/u014082714/article/details/file:/D:/Users/huchao/AppData/Local/Temp/SGTpbq/7972/0AAF0499.gif)
p5,指向了一个临时产生的父类对象 后者就是将值赋给真正的父类对象。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201401/1e1572b67270fb2a8c8288c5c1742525.png)
很明显this指针指向
![](http://blog.csdn.net/u014082714/article/details/file:/D:/Users/huchao/AppData/Local/Temp/SGTpbq/7972/0AAF0499.gif)
p5
相关文章推荐
- 继承中构造、析构 与 拷贝构造、赋值中的调用区别
- C++ 了解C++默默编写并调用哪些函数(构造 析构 拷贝构造 拷贝赋值)
- 继承中的构造和析构 继承和组合混搭情况下,构造函数、析构函数调用顺序研究
- vector的push_back对于拷贝构造和赋值操作的调用
- 继承与组合混搭情况下,构造和析构调用原则
- 让我们一步一步实现一个完整的 String 类:构造、拷贝、赋值、移动和析构
- 手写两个类,要体现构造,析构,拷贝构造,赋值,虚函数,重载函数等特点。
- String类简单实现(构造、拷贝构造、析构、赋值、输出、比较、字符串加、长度、子串)
- C++学习笔记:3.3.4 继承和组合混搭情况下,构造和析构调用顺序
- C++ 继承和组合混搭下的构造和析构调用原则
- C++ 类的三种构造函数(默认构造,拷贝构造,赋值构造),在什么情况下会被调用
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能
- 简单的String类(构造、拷贝构造、赋值构造、析构等)
- C++类定义对构造和析构的调用的区别
- string的四个函数--构造、析构、拷贝、赋值
- c++超基础:继承的构造与析构(赋值兼容性原则)
- C++中拷贝构造、赋值构造的区别
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
- 类构造,析构,赋值,拷贝
- 构造、拷贝(复制)构造、赋值构造以及析构