【C++】24 经典问题解析 多个对象析构顺序,const成员函数 this关键字

一、析构的疑问

当程序中存在多个对象的时候,如何确定这些对象的析构顺序
【C++】24 经典问题解析 多个对象析构顺序,const成员函数 this关键字_第1张图片

多个对象析构时

析构顺序与构造顺序相反
例:

#include 
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

关于析构的答案:

对于栈对象和全局对象,类似于入栈与出栈的顺序,最后构造的对象被最先析构!

堆对象的析构发生在使用delete的时候,与delete的使用顺序有关

关于const对象的疑问

const关键字能够修饰对象

const修饰的对象为只读对象

只读对象的成员变量不允许被改变

只读对象是编译阶段的概念,运行时无效

C++中的const成员函数

const对象只能调用const的员函数

const成员函数只能调用const成员函数

const成员函数中不能直接改写成员变量的值

#include 

class Test
{
    int mi;
public:
    Test(int i);
    Test(const Test& t);
    int getMi() const;
};

Test::Test(int i)
{
    mi = i;
}

Test::Test(const Test& t)
{
    
}
    
int Test::getMi() const
{
    return mi;
}

int main()
{
    const Test t(1);
    printf("t.getmi() = %d\n",t.getMi());
    return 0;
}

输出结果:

t.getmi() = 1

关于类成员的疑问

从面向对象的角度

对象由属性(成员变量)和方法(成员函数)构成

从程序运行的角度

对象由数据和函数构成

数据可以位于栈,堆和全局数据区

函数只能位于代码段

结论:

每一个对象拥有自己独立的属性(成员变量)

所有的对象共享类的方法(成员函数)

方法能够直接访问对象的属性

方法中隐藏参数,this用于指代当前对象。

例:

#include 

class Test
{
    int mi;
public:
    int mj;
    Test(int i);
    Test(const Test& t);
    int getMi() ;
    void print();
};

Test::Test(int i)
{
    mi = i;
}

Test::Test(const Test& t)
{
    mi = t.mi;
}
    
int Test::getMi() 
{
    return mi;
}
void Test::print()
{
    printf("this = %p\n",this);
}
int main()
{
    Test t1(1);
    Test t2(2);
    Test t3(3);
    printf("t.getmi() = %d\n",t1.getMi());
    printf("&t1 = %p\n",&t1);
    t1.print();
    
    printf("t.getmi() = %d\n",t2.getMi());
    printf("&t2 = %p\n",&t2);
    t2.print();
    
    printf("t.getmi() = %d\n",t3.getMi());
    printf("&t3 = %p\n",&t3);
    t3.print();
    return 0;
}

输出:

t.getmi() = 1
&t1 = 0xbfdad6e8
this = 0xbfdad6e8
t.getmi() = 2
&t2 = 0xbfdad6e0
this = 0xbfdad6e0
t.getmi() = 3
&t3 = 0xbfdad6d8
this = 0xbfdad6d8

小结:

对象的析构顺序与构造顺序相反

const关键字能够修饰对象,得到只读对象

只读对象只能调用const成员函数

所有对象共享类的成员函数

隐藏的this指针用于表示当前对象

你可能感兴趣的:(c++)