zoukankan      html  css  js  c++  java
  • 12.C++-构造与析构函数的调用,const成员函数,const对象,this指针

    单个对象创建时,构造函数的调用顺序

    1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数

    2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同)

    3.最后调用对象本身类的构造函数

    单个对象被注销后,调用的析构函数与对应构造函数的调用顺序相反

    参考下面示例,创建两个类Member,Test,然后Tesrt成员包含了Member类的成员:

    #include <stdio.h>
    
    class Member
    {
        const char* ms;
    public:
        Member(const char* s)
        {
            printf("Member(const char* s): %s
    ", s);     
            ms = s;
        }
        ~Member()
        {
            printf("~Member(): %s
    ", ms);
        }
    };
    
    class Test
    {
        Member mA;
        Member mB;
    public:
        Test() : mB("mB"), mA("mA")
        {
            printf("Test()
    ");
        }
        ~Test()
        {
            printf("~Test()
    ");
        }
    };
    
    Member gA("gA"); 
    
    int main()
    {
        Test t;   
        return 0;
    }
    

      

    运行打印:

    Member(const char* s): gA
    Member(const char* s): mA
    Member(const char* s): mB
    Test()
    
    ~Test()
    ~Member(): mB
    ~Member(): mA
    ~Member(): gA
    

    const成员函数

    为了体现对象的封装性,C++在类里引入了const成员函数

    • cosnt成员函数里只能调用const成员函数
    • const成员函数中不能直接修改成员变量的值
    • 只有对mutable修饰的成员变量, const成员函数是可以修改的
    • 如果用const修饰的函数,那么该函数一定是类的成员函数

    const成员函数定义,是在函数声明最右侧带上const关键字,例如:

    class Test{
    pbulic:
       int func(void) const;
    }
    
    int Test::func(void) const
    {   }
    

      

    const对象

    • const对象的成员变量不允许被改变,
    • const对象只能调用const成员函数,而非const对象可以访问const成员函数
    • const对象是编译阶段的概念,运行时无效

    const对象定义,是在对象声明最左侧带上const关键字,例如:

    class Test{
    pbulic:
       int func(void) const;
    }
    
    int Test::func(void) const
    {   }
    
    const Test t;   
    

      

     this指针

    大家都知道,每个对象的成员变量都是不同的,而成员函数只有一个,是共享的,存在text代码段里.

    为了知道当前是调用哪个对象的成员函数,所以,C++里有个隐藏的this指针,它永远指向当前对象

    当我们调用成员函数时,若函数参数和成员变量一样,我们就可以直接使用this指针来代替当前对象,比如:

    #include "stdio.h"
    class Test{
    
    private:
        int x;
        int y;
    
    public:
        Test(int x,int y)
        {
            this->x =x;      //通过this指针,找到对象
            this->y =y;       //通过this指针,找到对象
        }
    };
    
    int main()
    {
        Test t1(1,3);
        return 0;
    }    
  • 相关阅读:
    [贪心] Jzoj P4249 游戏
    [数学][快速幂] Jzoj P4248 n染色
    [dfs] Jzoj P4252 QYQ的图
    [折半搜索][has] Jzoj P4250 路径
    [计数dp][数学] Jzoj P4254 集体照
    [Tarjan][并查集][dp] Jzoj P4253 QYQ在艾泽拉斯
    [支配树][lca][倍增][线段树][拓扑] Jzoj P4240 游行
    [贪心] Jzoj P4244 yi
    [数位dp] Jzoj P4239 光棍
    [扫描线][差分约束] Jzoj P4238 纪念碑
  • 原文地址:https://www.cnblogs.com/lifexy/p/8592192.html
Copyright © 2011-2022 走看看