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.成员函数,成员变量是否属于具体对象)的更多相关文章

  1. 第24课经典问题(中)-----关于const对象的疑问

    关于const对象的疑问const关键字能否修饰类的对象?如果可以,有什么特性?const关键字能够修饰对象const修饰的对象为只读对象只读对象的成员变量不允许被改变.(对象是只读的,成员变量不允许 ...

  2. 第12课.经典问题解析(const;指针和引用)

    问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...

  3. C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数

    C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...

  4. 跟我一起学编程—《Scratch编程》第24课:幸运大转盘

    同学你好,欢迎来到<跟我一起学编程>,我是包老师.这是<Scratch3.0编程>课程的第24课,我这节课教你做一个抽奖游戏:幸运大转盘. 学习目标: 1. 能够熟练使用造型工 ...

  5. 第24课 - #pragma 使用分析

    第24课 - #pragma 使用分析 1. #pragma简介 (1)#pragma 是一条预处理器指令 (2)#pragma 指令比较依赖于具体的编译器,在不同的编译器之间不具有可移植性,表现为两 ...

  6. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  7. c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数

    一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include&l ...

  8. C++基础-4-封装(构造函数与析构函数,深拷贝与浅拷贝,静态成员,this,友元,const修饰成员函数)

    4. 封装 4.1.1 封装的意义 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 con ...

  9. C++-理解构造函数、析构函数执行顺序

    先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...

随机推荐

  1. harbor1.9仓库同步迁移

    harbor 1.9 实战的仓库迁移,过程实际上就是从A push 到B.16个tag 不到100G,挺快的 1分钟多. 假设我们从A迁移到B. 1.先在A上面建立一个目标仓库.    

  2. 3、获取Class对象的三种方式

    3.获取Class对象的三种方式 要想对字节码文件进行解刨,必须要有字节码文件对象 Object类中的getClass方法 通过对象静态属性 .class来获取对应的Class对象 只要通过给定类的字 ...

  3. The method setCharacterEncoding(String) is undefined for the type HttpServletResponse

    今天将以前做的一个web项目从不笔记本上移到台式机上,import项目后出现“The method setCharacterEncoding(String) is undefined for the ...

  4. 【概率论】3-7:多变量分布(Multivariate Distributions Part II)

    title: [概率论]3-7:多变量分布(Multivariate Distributions Part II) categories: Mathematic Probability keyword ...

  5. Egyptian Collegiate Programming Contest (ECPC 2015)

    题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找 ...

  6. ICEM-extrude功能画圆柱绕流网格【转载】

    转载自:http://blog.csdn.net/lgw19910426/article/details/26401517 首先画网格大体顺序为点-->线-->面-->单元体. 第一 ...

  7. python网络爬虫(一):网络爬虫的定义

    网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开 ...

  8. linux 后台 运行

    但是如果终端关闭的话,程序也会终止,那么就要涉及到linux的一个十分强大的命令:screen. 按照我个人的理解,这个命令就是能够在linux中创造出多个终端,在已有的窗口内部再创造更多的窗口,结合 ...

  9. vue实现全选框效果

    vue实现全选框效果 一.总结 一句话总结: 全选的checkbox点击的时候判断这个checkbox的状态,如果没选中,说明下一个操作是选中所有 下面的每个checkbox判断一下是否所有的chec ...

  10. export default {} 和new Vue()区别?

    export default 的用法:相当于提供一个接口给外界,让其他文件通过 import 来引入使用. 而对于 new Vue({})部分, 只是创建一个Vue的实例 就是相当于创建一个根组件 h ...