• 继承中构造、析构 与 拷贝构造、赋值中的调用区别


    有错误欢迎批评指正!谢谢!

    1.当一个类继承另一个类的时候,子类构造函数与析构函数在自己的类中不需要显示调用父类的构造函数与析构函数

    2.当一个类继承另一个类的时候,子类的拷贝构造函数需要显示的调用父类的拷贝构造函数,且必须按初始化的方式调用!

    3.当一个类继承另一个类的时候,子类的赋值函数也需要显示的调用父类的赋值函数

    #include<iostream>
    using namespace std;
    int i=1;
    class base{
    public:
        base(){
            valueBase=i;
            i++;
            valueBase2=i;
            i++;
            printf("base create!
    ");
        }
    
        base(base &temp){
            valueBase=temp.valueBase;
            valueBase2=temp.valueBase2;
            printf("base copy create!
    ");
        }
    
        base& operator =(const base & temp){
            valueBase=temp.valueBase;
            valueBase2=temp.valueBase2;
            printf("base = operator!
    ");
            return *this;
        }
    
        ~base(){
            printf("delete base!
    ");
        }
        int valueBase;
        int valueBase2;
    };
    
    class child:public base{
    public:
        child(){
            
            p=new char;
            *p='0'+i;
            printf("child create!
    ");
        }
        
        child(child &temp):base(temp){
    
            //base::base(temp); //一定写成上面初始化的方法,否则会有临时变量产生,且父类赋值不正确,其实这样是将值赋给了临时变量而不是正真的父类
            p=new char;
            *p=*temp.p;
            printf("child copy create!
    ");
        }
    
        child& operator =(const child & temp){
    
            base::operator=(temp); //赋值函数必须显示的调用父类的赋值函数,否则不会去执行父类的赋值函数
    
            *p=*temp.p;
            printf("child = operator!
    ");
            return *this;
        }
        ~child(){
            printf("delete child!
    ");
        }
        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!
    ");
        }

        child(child &temp):base(temp){
            p=new char;
            *p=*temp.p;
            printf("child copy create!
    ");
        }

    有什么区别?

    前者将会构造产生一个临时父类对象,且把值赋给这个临时父类对象,而不是正真的父类对象!

    调试:

    发现this指针不是指向p5,指向了一个临时产生的父类对象

    后者就是将值赋给真正的父类对象。

    很明显this指针指向p5

  • 相关阅读:
    大话字符串逆序
    Class文件结构全面解析(上)
    怎么把CAT客户端的RootMessageId记录到每条日志中?
    阅读JDK源码后,我有了优化它的冲动!
    CAT客户端如何从Apollo中读取配置?
    Sublime Text 3许可证
    通俗易懂地给女朋友讲:线程池的内部原理
    五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链
    分布式监控CAT服务端的本地部署
    如何优雅的设置线程池的大小?
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3503224.html
Copyright © 2020-2023  润新知