• C++面对对象基础


    1 C++的模型初探

    • 在语言中直接对对象程序设计的部分,主要设计了构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态。

    • 对于各种支持的底层实现的机制

      在C语言中,定义的数据和处理数据的函数是分离的,换句话说就是数据和处理数据的函数本身是没有关联的,语言本身是没有支持数据和函数联系的特性。在C++中,通过抽象数据类型(abstract data ADT),在类中定义了数据和函数,来实现数据和函数的直接的绑定,所以C++是一个面对对象思想的语言,C语言是一种面对过程的语言,但是我个人理解,面对对象和面对过程是一种思维方式,C同时可以做到面向对象,只是比较C++而言更不直观和方便。

    • 整体说来在C++中类存在两种成员数据:staticnonstatic; 三种成员函数: staticnostaticvirtual

    image-20211111025933179

    2 面向对象的基础知识

    C++中class从面对对象出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实中的类。但是对于计算机,程序并没有没有什么不同。

    /***************************************************************************************
    @ Copyright    : 
    @ Author       : Krone
    @ Data         : Do not edit
    @ LastEditor   : 
    @ LastData     : 
    @ Describe     : 
    *****************************************************************************************/
    #include "iostream"
    using namespace std;
    
    class C1
    {
    public:
    	int i;  //4
    	int j;  //4
    	int k;  //4
    protected:
    private:
    }; //12
    
    class C2
    {
    public:
    	int i; //4 
    	int j; //4
    	int k; //4
    	static int m; 
    public:
    	int getK() const 
        {
            return k;
        } 
    	void setK(int val) 
        {
    	 	k = val; 
        }  
    protected:
    private:
    }; 
    struct S1
    {
    	int i;
    	int j;
    	int k;
    }; 
    
    struct S2
    {
    	int i;
    	int j;
    	int k;
    	static int m;
    }; //
    
    int main()
    {
    	printf("c1:%d \n", sizeof(C1));
    	printf("c2:%d \n", sizeof(C2));
    	printf("s1:%d \n", sizeof(S1));
    	printf("s2:%d \n", sizeof(S2));
    	system("pause");
    }
    
    

    image

    通过上面的例子,我们可以得到:

    • C++类对象中成员变量和成员函数是分开存储

    • 成员变量:

      • 普通成员变量:储存于对象中,与struct变量有相同的内存布局和对齐方式
      • 静态成员变量:储存于全局变量

      成员函数:储存于代码代码段中。

    那么就存在一个问题,C++编译器是如何将面向对象理论计算机的转变,或者说C++编译器是如何管理具体的对象和方法的?

    class Test
    {
    	private:
    		int m1;
    	public:
    		Test(int i)
    		{
    			m1 = i;
    		}
    		int getm1()
    		{
    			return m1; 
    		}
    		static void print()
    		{
    			printf("this is class Test\n");
    		}
    };
    
    Test a(10);
    a.getm1();
    Test::print();
    
    struct TestC
    {
      int m1; 
    };
    
    int Test_getm1(Test **p_this*)
    {
      return *p_this*->m1;
    }
    
    void Test_init(Test **p_this*)
    {
      *p_this*->m1;
    }
    
    void Test_printf()
    {
      printf("this is class Test\n"); 
    }
    
    Test a;
    Test_init(&a,10);
    Test_getm1(&a);
    Test_printf();
    

    对比这两个代码,我们可以得到几个结论:

    • C++类中的成员变量和成员函数的分开存储的,也就是说我们之前学习的内存四区的模型依然是有效的。
    • C++中的每一个普通的函数都隐式的包含了一个指向当前对象的this指针
    • 静态成员变量,成员变量属于类,但是静态成员变量和普通成员变量依然在this指针上存在差异,静态成员变量不包含指向具体对象的指针,而普通的成员变量存在指向具有对象的指针。

    3 const修饰成员函数

    • const类对象只能调用const成员函数,不能调用普通成员函数;
    • const成员函数不能修改类的成员变量,若要修改则用mutable修饰该成员变量。
  • 相关阅读:
    Ubuntu中设置永久的DNS
    Ubuntu上OpenStack DashBoard主题修改的方案
    OpenStack 控制台不能不能访问的问题
    树莓派2试玩
    SharpMap V1.1 For Web教程系列之——地图展示
    剑指offer12 矩阵中的路径
    flex布局中关键词整理
    浏览器缓存 强缓存 协商缓存整理
    二叉搜索树中第K小的元素
    leetcode cs-notes-树(一)【js】
  • 原文地址:https://www.cnblogs.com/Kroner/p/15542708.html
Copyright © 2020-2023  润新知