12.C++-构造函数与析构函数调用顺序,const成员函数,const对象

时间:2023-12-27 22:22:25

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

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(,);
return ;
}