• 类和对象(1):类,对象,this指针


    面向过程和面向对象初步认识:

    1. C语言是面向过程的,关注的是过程,分析出问题求解的步骤,用函数调用逐步解决。
    2. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

    一、类

    e.g.

    #include 
    using namespace std;
    
    // 在C++中,struct 升级成了类(C++兼容C语言struct的所有语法)
    // 1. Stack 就是类型名,不用加struct
    // 2. 类里面可以定义函数
    struct Stack
    {
        int* _a;
        int _top;
        int _capacity;
        
        void Init()
        {
            _a = nullptr;
            _top = _capacity = 0;
        }
    };
    
    int main()
    {
        Stack s1;
        s1.Init();
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    1.1 类的定义

    在C++中,更喜欢用关键字 class定义类。

    class Name
    {
      // 类体:由成员函数和成员变量组成
    };
    
    • 1
    • 2
    • 3
    • 4
    类定义的两种方式:
    1. 声明和定义全部放在类体中。

      PS: 成员函数如果在类中定义编译器会把其当作内联函数(是否展开取决于编译器)。

    在这里插入图片描述

    1. 类声明放在.h文件中,成员函数定义放在.cpp文件中。

    Sup:

    类的作用域:

    类定义了一个新的作用域,类的所有成员都在作用域内。在类外定义成员时,需要使用::作用域限定符指明成员属于哪个类作用域。

    // Stack.h
    struct Stack
    {
    	// ...
        void Init();
    };
    
    // Stack.cpp
    // 指定Init属于Stack类域
    void Stack::Init()
    {
        // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1.2 访问限定符

    在C++中利用类,通过访问权限选择性的将其接口提供给外部用户使用。

    访问限定符:publicprotectedprivate

    PS:

    1. public修饰的成员在类外可以直接被访问protectedprivate修饰的成员在类外不能被直接访问
    2. 访问权限作用域从该访问限定符出现的位置开始,到下一个访问限定符出现结束;如果后面没有访问限定符,则作用域到}结束(即类结束)。
    3. class 的默认访问权限为privatestruct 的默认访问权限为public(C++要兼容C语言)。
    1.3 类的实例化

    用类类型创建对象的过程,称为类的实例化。

    1. 类是对对象进行描述的,定义出一个类并没有分配出实际的内存空间来储存它
    class Stack
    {
    private:
        // 类成员变量声明,并不开辟实际内存空间
        int* _a;
        int _top;
        int _capacity;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 一个类可以实例化多个对象,实例化出的对象占用实际物理空间,储存类成员变量
    int main()
    {
        Stack s1;
        cout << sizeof(s1) << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    二、对象

    类对象的储存方式:只保存成员变量,成员函数放在公共的代码段

    一个类的大小,实际就是该类中“成员变量之和”(要考虑内存对齐);注意空类大小,编译器给空类一个字节来唯一标识这个类的对象

    #include 
    using namespace std;
    
    class A1 // 空类
    {};
    
    class A2 // 只有成员函数
    {
    public:
        void f();
    };
    
    class A3 // 既有成员变量又有成员函数
    {
    private:
        int* _a;
    public:
        void Init();
    };
    
    int main()
    {
        cout << sizeof(A1) << endl; // 1
        cout << sizeof(A2) << endl; // 1
        cout << sizeof(A3) << endl; // 4
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    三、this 指针

    class Date
    {
    private:
        int _year;
        int _month;
        int _day;
        
    public:    
        void Init(int year = 10, int month = 10, int day = 10)
        {
            _year = year;
            _month = month;
            _day = day;
    	}
        
        void Print()
        {
            cout << _year << " " << _month << " " << _day << endl;
    	}
    };
    
    int main()
    {
        Date d1;
        Date d2;
        
        d1.Init();
        d2.Init(2023, 10 ,26);
        
        d1.Print();
        d2.Print();
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    C++为每个“非静态成员函数”增加了一个隐含的指针参数——this指针,让this指针指向该当前对象,在函数体中所有关于“成员变量”的操作都是通过this指针去访问(编译器自动完成)。

    在这里插入图片描述

    this指针相关的实参和形参不能显示写出。

  • 相关阅读:
    pytorch学习笔记——BCE与CE
    每日一学vue2:自定义绑定事件解除方式($off)及销毁vc
    自接触svn之后对git的了解及其应用
    Chromium 调试指南2024 Mac篇 - 编译 Chromium(二)
    Devops学习Day3--jacoco的详细使用
    使用ElementPlus实现内嵌表格和内嵌分页
    k8s client-go源码分析 informer源码分析(6)-Indexer源码分析
    爆款自媒体带货脚本,大V不外传的流量密码
    酒店品牌纷纷冲击中高端,东呈集团能否“快人一步”?
    Spring Cloud Gateway 参考指南
  • 原文地址:https://blog.csdn.net/taduanlangan/article/details/134067344