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; }
人间有真情,人间有真爱。