zoukankan      html  css  js  c++  java
  • 二十二、经典问题解析二

    1、关于析构的疑问

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

    1. 调用父类的构造过程
    2. 调用成员变量的构造函数(调用顺序与声明顺序相同)
    3. 调用类自身的构造函数

    析构函数与对应的构造函数的调用顺序相反

    #include <stdio.h>
    
    class Member
    {
    	const char* ms;
    public:
    	Member(const char* s)
    	{
    		printf("Member(const char* s): %s
    ", s);
    		ms = s;
    	}
    	~Member()
    	{
    		printf("~Member(): %s
    ", ms);
    	}
    };
    
    class Test
    {
    	Member mA;
    	Member mB;
    public:
    	Test() : mB("mB"), mA("mA")
    	{
    		printf("Test()
    ");
    	}
    	~Test()
    	{
    		printf("~Test()
    ");
    	}
    };
    
    Member gA("gA");
    
    int main()
    {
    	Test t;
    
    	return 0;
    }
    
    /*构造
    gA
    mA
    mB
    Test()
    析构
    ~Test()
    mB
    mA
    gA
    */
    
    

    关于析构

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

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

    2、关于const对象的疑问

    const关键字能否修饰类的对象?如果可以,有什么特性?

    • const关键字能够修改对象

    • const修饰的对象为只读对象

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

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

    C++中的const成员函数

    • const对象只能调用const成员函数
    • const成员函数中只能调用const成员函数
    • const成员函数中不能直接改写成员变量的值

    const成员函数的定义:

    Type ClassName::function(Type p) const
    

    类中的函数声明与实际函数定义中都必须带const关键字

    #include <stdio.h>
    
    class Test
    {
    	int mi;
    public:
    	int mj;
    	Test(int i);
    	Test(const Test& t);
    	int getMi() const;
    };
    
    Test::Test(int i)
    {
    	mi = i;
    }
    
    Test::Test(const Test& t)
    {
    	// 对象引用,加上了const,使对象t的引用加上了只读属性
    	// 只能调用const成员函数
    	//t.getMi();
    	
    	t.mi; // 直接访问了private成员
    }
    
    int Test::getMi() const
    {
    	//mi = 20;	// const成员函数不能更改成员变量的值 err
    	return mi;
    }
    
    int main()
    {
    	const Test t(1);
    	// const修饰对象,只读对象,所对应的成员变量的值不可直接改变
    	// t.mj = 100;		// mj是一个只读变量了,err
    
    	printf("t.getMi() = %d
    ", t.getMi());
    	// getMi()不能被调用
    	// 只读对象,只能调用const成员函数
    
    
    	return 0;
    }
    
    

    3、关于类成员的疑问

    成员函数和成员变量都是隶属于具体对象吗?

    从面向对象的角度:

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

    从程序运行角度:

    • 对象由数据和函数构成
      • 数据可以位于栈、堆和全局数据区
      • 函数只能位于代码段

    结论:

    • 每一个对象拥有自己独立的属性(成员变量)
    • 所有的对象共享类的方法(成员函数)
    • 方法能够直接访问对象的属性
    • 方法中隐藏参数 this 用于指代当前对象

    成员函数怎么分辨不同对象呢? ---> this指针,代表当前调用这个函数的对象

    #include <stdio.h>
    
    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
    ", this);	// 将this指针打印出来
    }
    
    int main()
    {
        Test t1(1);
        Test t2(2);
        Test t3(3);
        
        printf("t1.getMi() = %d
    ", t1.getMi());
        printf("&t1 = %p
    ", &t1);	// 打印t1的地址值
        t1.print();	// 打印t1的this指针值
        /*结果:
            t1.getMi() = 1
            &t1 = 0xbf85da68
            this = 0xbf85da68
        */
        // this 指针指向当前指针
        
        printf("t2.getMi() = %d
    ", t2.getMi());
        printf("&t2 = %p
    ", &t2);
        t2.print();
        
        printf("t3.getMi() = %d
    ", t3.getMi());
        printf("&t3 = %p
    ", &t3);
        t3.print();
        
        return 0;
    }
    
    

    成员函数只有一套,成员函数能够直接访问对应类的成员变量

    // 所以在这个拷贝构造函数中可以访问成员变量
    Test::Test(const Test& t)
    {
        mi = t.mi;
    }
    

    4、小结

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

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

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

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

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

  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/chenke1731/p/9703515.html
Copyright © 2011-2022 走看看