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\n", s);     
        ms = s;
    }
    ~Member()
    {
        printf("~Member(): %s\n", ms);
    }
};

class Test
{
    Member mA;
    Member mB;
public:
    Test() : mB("mB"), mA("mA")
    {
        printf("Test()\n");
    }
    ~Test()
    {
        printf("~Test()\n");
    }
};

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;
}    
posted @ 2018-03-17 19:41  诺谦  阅读(1051)  评论(2编辑  收藏  举报