第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)
1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序?
单个对象
单个对象创建时构造函数的调用顺序
a.调用父类的构造函数
b.调用成员变量的构造函数(调用顺序与声明顺序相同)
c.调用类自身的构造函数
析构函数与对应的构造函数的调用顺序相反
多个对象
多个对象时,析构函数与构造顺序相反
eg:这端代码就可以解释上述
#include <stdio.h>
class Member
{
const char *ms; //这里是const指针
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;
}

对于栈对象和全局对象,类似于入栈和出栈的顺序,最后构造的对象最先构造
堆对象的析构发生在使用delete的时候,与delete的使用顺序相关
2.const关键字能否修饰类的对象?如果可以,有什么特性?
const对象
a.const关键字能够修饰对象
b.const修饰的对象为只读对象
c.只读对象的成员变量不能直接被改变(因为它的变量成了只读变量)
d.只读对象是编译阶段的概念,运行时无效
const成员函数
a.const对象只能调用const成员函数
b.const成员函数中只能调用const成员函数
c.const成员函数中不能直接改写成员变量的值 (因为它的变量成了只读变量)
const成员函数的定义:在函数的后面,函数体之前加上const关键字。
类中的函数声明和实际的函数定义中都必须带const关键字。
Type ClassName::function(Type p) const
const成员变量(20课,放在这里是为了对比学习)
a.类中的const成员变量会被分配空间
b.类中的const成员变量的本质是只读变量
c.类中的const成员变量只能在初始化列表中指定初始值(当然了指针类的可以间接去修改,见本课第一个例子)
(编译器无法直接得到const成员变量的初始值,因此无法进入符号表成为真正意义上的常量)
#include <stdio.h>
class Test
{
int mi;
public:
int mj;
Test(int i);
Test(const Test& t);
int getMi() const; //const函数
};
Test::Test(int i)
{
mi = i;
}
Test::Test(const Test& t)
{
//如果去掉int getMi() const;的const使他成为一个普通到成员函数时使用下面语句是否合法 (此时函数到定义也要去掉相应到const)
mi = t.getMi(); //不合法,因为const Test& t表明t是const对象,所以t只能调用const函数。
}
int Test::getMi() const
{
//mi = 2; //不合法
return mi;
}
int main()
{
const Test t(1); //const对象
printf("t.getMi() = %d\n", t.getMi()); //注意函数的使用不带const
return 0;
}
3.成员函数和成员变量都是隶属于具体对象的吗?
a.从面向对象的角度来看
对象有属性(成员变量)和方法(成员函数)构成
b.从程序运行的角度
对象有数据(可以位于栈,堆,全局数据区)和函数构成(只能位于代码段)
结论:
a.每个对象都拥有自己的独立属性(成员变量)
b.所有的对象共享类的方法(成员函数)
c.成员函数能够直接访问对象的属性
d.成员函数中有隐藏参数this用于指代当前对象(共享的成员函数是怎么分辨是哪个对象在调用它呢?this参数会记录当前对象的地址)
Test::Test(const Test& t)
{
//这里来源于上述例子中,稍做修改。是否合法?t.mi是private怎么能被这样t.mi把它拿出来使用?
mi = t.mi; //合法,因为mi是类的成员变量。并且t.mi在拷贝函数中使用(特殊的成员函数)。成员函数能够直接访问对象的属性。
}
第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)的更多相关文章
- 第24课经典问题(中)-----关于const对象的疑问
关于const对象的疑问const关键字能否修饰类的对象?如果可以,有什么特性?const关键字能够修饰对象const修饰的对象为只读对象只读对象的成员变量不允许被改变.(对象是只读的,成员变量不允许 ...
- 第12课.经典问题解析(const;指针和引用)
问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...
- C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数
C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...
- 跟我一起学编程—《Scratch编程》第24课:幸运大转盘
同学你好,欢迎来到<跟我一起学编程>,我是包老师.这是<Scratch3.0编程>课程的第24课,我这节课教你做一个抽奖游戏:幸运大转盘. 学习目标: 1. 能够熟练使用造型工 ...
- 第24课 - #pragma 使用分析
第24课 - #pragma 使用分析 1. #pragma简介 (1)#pragma 是一条预处理器指令 (2)#pragma 指令比较依赖于具体的编译器,在不同的编译器之间不具有可移植性,表现为两 ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数
一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include&l ...
- C++基础-4-封装(构造函数与析构函数,深拷贝与浅拷贝,静态成员,this,友元,const修饰成员函数)
4. 封装 4.1.1 封装的意义 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 con ...
- C++-理解构造函数、析构函数执行顺序
先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...
随机推荐
- sqlserver2014安装Windows版教程
下载好安装包,直接运行 根据自己的情况选择,我是首次安装,选择第一项即可. 之后一路下一步,然后等待安装. 安装完成
- [Google Guava] 1.5-Throwables:简化异常和错误的传播与检查
原文链接 译者: 沈义扬 异常传播 有时候,你会想把捕获到的异常再次抛出.这种情况通常发生在Error或RuntimeException被捕获的时候,你没想捕获它们,但是声明捕获Throwable和E ...
- 普通java类获取spring容器bean的方法
很多时候,我们在普通的java类中需要获取spring的bean来做操作,比如,在线程中,我们需要操作数据库,直接通过spring的bean中构建的service就可以完成.无需自己写链接..有时候有 ...
- Git 的核心概念
本文不是Git使用教学篇,而是偏向理论方面,旨在更加深刻的理解Git,这样才能更好的使用它,让工具成为我们得力的助手. 版本控制系统 Git 是目前世界上最优秀的分布式版本控制系统.版本控制系统是能够 ...
- [HNOI2015]开店 简要题解
主席树. 推下式子,发现点的深度和好算,lca深度和不好算. lca深度之和有个套路:先给a到根路径+1,再算b到根的和. 如果可以离线,即LNOI的LCA.本题强制在线,可持久化. 由于区间修改,使 ...
- scrapy3 中间件的使用
前情提要: 补充知识点: ua请求头库的使用 安装: pip install fake-useragent 使用: from fake_useragent import UserAgent ua = ...
- ckeditor粘贴word图片自动上传功能
由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...
- 【线性代数】7-3:对角化和伪逆(Diagonalization and the Pseudoinverse)
title: [线性代数]7-3:对角化和伪逆(Diagonalization and the Pseudoinverse) categories: Mathematic Linear Algebra ...
- 使用Flask设计带认证token的RESTful API接口
大数据时代 Just a record. 使用Flask设计带认证token的RESTful API接口[翻译] 上一篇文章, 使用python的Flask实现一个RESTful API服务器端 简 ...
- 微信小程序之简单记账本开发记录(六)
昨天虽然将页面成功的搭建出来 但是其中的增删改查功能没有实现,需要到逻辑页面,即js页面注册一下 效果如下图