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

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 ;
}

12.C++-构造函数与析构函数调用顺序,const成员函数,const对象的更多相关文章

  1. C++类的继承中构造函数和析构函数调用顺序例子

    /*当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.简而言之,对象是由“底层向上”开始构造的.因为,构造函数 ...

  2. c++深/浅拷贝 && 构造函数析构函数调用顺序练习题

    1.深/浅拷贝 编译器为我们提供的合成拷贝构造函数以及合成的拷贝赋值运算符都是浅拷贝.浅拷贝只是做简单的复制,如果在类的构造函数中new出了内存,浅拷贝只会简单的复制一份指向该内存的指针,而不会再开辟 ...

  3. C++单继承的构造函数和析构函数调用的顺序

    1.继承构造函数调用顺序以及销毁的过程 先调用父类的构造函数,在调用子类的构造函数,析构函数调用相反.

  4. C++构造函数和析构函数调用虚函数时都不会使用动态联编

    先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...

  5. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...

  6. 拷贝构造函数和const成员函数

    实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip   ...

  7. c++ 学习之const专题之const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...

  8. C++ Const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如:  int Point::GetY() { return yVal; }  这个函数被调用时,不改变Point对象,而下面的函数改变Point对象 ...

  9. c++中的const参数,const变量,const指针,const对象,以及const成员函数

    const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...

随机推荐

  1. java库中的具体的集合

    1.ArrayList  一种可以动态增长和缩减的索引序列:速度较慢适合用于不修改太多的元素    采用的数组 2.LinkEdList  一种可以在任何位置进行高效的插入和删除操作的有序序列,适合于 ...

  2. “No module named context_processors”

    之前因为django国际化的问题在settings.py里面改了很多东西,国际化是好使了,但是今天要用站点管理admin的时候出!错!了! 我前天用的时候还好好的啊,我的models.py和admin ...

  3. UVALive - 3938 (线段树,区间查询)

    思路:详细分析见训练指南.注意可能答案的起点在左区间,终点在右区间 AC代码 #include <stdio.h> #include <algorithm> using nam ...

  4. jmeter压力测试笔记- HTTP协议

    一.目标 使用jmeter进行HTTP接口压力测试: 命令行方式运行,方便在linux环境运行: 二.面临的问题 支持多环境测试(开发.测试.生产环境) 支持用户数据.线程数.循环次数等配置在运行时自 ...

  5. Linux中的DRM

    如果在搜索引擎离搜索 DRM 映入眼帘的尽是Digital Rights Managemen,也就是数字版权加密保护技术.这当然不是我们想要的解释.在类unix世界中还有一个DRM即The Direc ...

  6. Ubutu Chrome 出现adobe flash is out of date的解决方法

    我们需要到官网下载flash player,网址:https://get.adobe.com/flashplayer/ 不过这里要说明一下: 一般的浏览器使用的是npapi,即adobe flash ...

  7. 安装coreseek cannot find input file: src/Makefile.in 错误解决方法

    安装coreseek 出现了cannot find input file: src/Makefile.in 解决方法如下 >autoheader >automake --add-missi ...

  8. hi3531 SDK 编译 uboot, 修改PHY地址, 修改 uboot 参数 .

    一,编译uboot SDK文档写得比较清楚了,写一下需要注意的地方吧. 1. 之前用SDK里和别人给的已经编译好的uboot,使用fastboot工具都刷不到板子上.最后自己用SDK里uboot源码编 ...

  9. 生物结构变异分析软件meerkat 0.189使用笔记(二)

    一. 运行meerkat 前面已经依序安装了meerkat 的环境和meerkat,运行了预处理一步,在相对应的bam文件目录下生成了大批文件,因此,当要用meerkat处理某个bam文件时,应先将该 ...

  10. 关于swiper的滚动条滑动

    <div class="swiper-container2"> <div class="swiper-wrapper"> <div ...