12.C++-构造函数与析构函数调用顺序,const成员函数,const对象
单个对象创建时,构造函数的调用顺序
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对象的更多相关文章
- C++类的继承中构造函数和析构函数调用顺序例子
/*当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.简而言之,对象是由“底层向上”开始构造的.因为,构造函数 ...
- c++深/浅拷贝 && 构造函数析构函数调用顺序练习题
1.深/浅拷贝 编译器为我们提供的合成拷贝构造函数以及合成的拷贝赋值运算符都是浅拷贝.浅拷贝只是做简单的复制,如果在类的构造函数中new出了内存,浅拷贝只会简单的复制一份指向该内存的指针,而不会再开辟 ...
- C++单继承的构造函数和析构函数调用的顺序
1.继承构造函数调用顺序以及销毁的过程 先调用父类的构造函数,在调用子类的构造函数,析构函数调用相反.
- C++构造函数和析构函数调用虚函数时都不会使用动态联编
先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- 拷贝构造函数和const成员函数
实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip ...
- c++ 学习之const专题之const成员函数
一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...
- C++ Const成员函数
一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象 ...
- c++中的const参数,const变量,const指针,const对象,以及const成员函数
const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...
随机推荐
- IE8兼容问题总结---trim()方法
1.IE8不支持,jquery的trim()去空格的方法 错误表现 : 会报错,对象不支持此属性或方法; 解决办法 : 使用正则匹配空格 例如 : /^\s+|\s+$/greplace(/^\s+| ...
- QPS/TPS简介
系统吞度量要素 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高,外部系统接口.IO影响速度越慢,系统吞吐能力越低,反之越高 ...
- R学习笔记:了解R的使用
R是一种区分大小写的解释性语言,只支持单行注释,注释由符号#开头,当前行出现在#之后的任何文本都会被R解释器忽略.R脚本的一次执行叫做一个会话(Session),可以通过函数quit()退出当前的会话 ...
- Yii2按需加载图片怎么做?
按需加载图片应该用 jQuery LazyLoad 图片延迟加载按需加载文件夹应该用 Yii::import
- Nginx + uwsgi + django + websocket(dwebsocket)环境部署
1.安装nginx(/export/servers/nginx/) 保证/export/servers/nginx/是nginx的安装目录 /export/servers/nginx/conf/dom ...
- Ubuntu上搭建Hadoop环境(单机模式+伪分布模式)
首先要了解一下Hadoop的运行模式: 单机模式(standalone) 单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选 ...
- 2018.3.6学习java的第一天
学习java,那么不得不先了解一下java,java分为三部分,JAVA SE,JAVA EE和JAVA ME,其中前期我们首先要学习Java SE.java是一门语言,我们平时人与人之间对话,用中文 ...
- Java中的Lock与synchronized
并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...
- 详解Java的自动装箱与拆箱(Autoboxing and unboxing)
一.什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程 //自动装箱 Integer total = 99; //自定拆箱 int totalprim = total; 简单一点说,装箱 ...
- AndFix
AndFix 是阿里巴巴开源的 Android 应用热修复工具,帮助 Anroid 开发者修复应用的线上问题.Andfix 是 "Android hot-fix" 的缩写.支持 A ...