• 类和对象(上)



    一、面向过程和面向对象初步认识

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

    举个例子,现在我们需要买一斤卷心菜。 面向过程就是我怎么样去买菜:走出家门,飞到菜市场,挑选卷心菜,给钱,飞回家。 面向对象就是我作为一个对象,我负责前往菜市场、挑选合适的菜,卷心菜作为一个对象,负责处于菜市场的位置,被挑,通过我和卷心菜的交互完成买菜。

    二、类的引入

    C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

    struct Student
    {
    	void SetStudentInfo(const char* name, const char* gender, int age)
    	{
    		strcpy(_name, name);
    		strcpy(_gender, gender);
    		_age = age;
    }
    	void PrintStudentInfo()
    	{
    		cout<<_name<<" "<<_gender<<" "<<_age<<endl;
    	}
    	char _name[20];
    	char _gender[3];
    	int _age;
    };
    
    //上面结构体的定义,在C++中更喜欢用class来代替
    
    int main()
    {
    	Student s;
    	s.SetStudentInfo("Peter", "男", 18);
    	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

    三、类的定义

    class className
    {
    // 类体:由成员函数和成员变量组成
    };
    
    • 1
    • 2
    • 3
    • 4

    class为定义类的关键字,classname为类名。
    { }中为类的主体,类中的元素称为类的成员:
    类中的数据称为类的属性或者成员变量;
    类中的函数称为类的方法或者成员函数。
    类的两种定义方式:
    1.定义时成员函数声明和定义都放在类中。
    2.定义时成员函数声明和定义分离,声明放在.h文件中,定义放在.cpp文件中。

    四、类的访问限定符及封装

    1.访问限定符:

    public:公有
    private:私有
    protected:保护
    在类的某个区域加上访问限定符,可以限制对该区域的访问。
    比方说,
    在这里插入图片描述
    上图是一个类,
    红色部分是私有的,类外部分是没有权限访问红色的。
    蓝色部分是共有的,任何人想用就用。
    白色部分是受保护的,类外部分也是没有权限访问的。
    橙色部分没有进行说明,如果是用class定义的类,默认为私有

    2.封装

    C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用
    当自身的逻辑发生变化时,不会破坏使用方的逻辑,或是强制使用方修改自身的逻辑,而是只需要修改自身的代码就可以了。

    五、类的作用域

    class Person
    {
    	public:
    	void PrintPersonInfo();
    	private:
    	char _name[20];
    	char _gender[3];
    	int _age;
    };
    
    	void PrintPersonInfo()
    {
    	cout<<_name<<" "_gender<<" "<<_age<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    上述代码的两个PrintPersonInfo是同一个函数吗?
    还真不是。
    在类外定义类的成员,需要再成员前声明其属于的类。
    比方说上文的PrintPersonInfo应该加上 “类名::”
    在这里插入图片描述

    六、类的实例化

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

    1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
    2. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
    3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

    七、类的对象大小的计算

    空类占用一个字节,结构体内存对齐

    八、类成员函数的this指针

    非静态成员函数实际上的形参个数比程序员写的多一个。多出来的参数就是所谓的“this指针”。这个“this指针”指向了成员函数作用的对象,在成员函数执行的过程中,正是通过“Ihis指针”才能找到对象所在的地址,因而也就能找到对象的所有非静态成员变量的地址。
    在这里插入图片描述

    // 1.下面程序能编译通过吗?
    // 2.下面程序会崩溃吗?在哪里崩溃
    class A
    {
    	public:
    	void PrintA()
    	{
    	cout<<_a<<endl;
    	}
    	void Show()
    	{
    		cout<<"Show()"<<endl;
    	}
    	private:
    	int _a;
    };
    int main()
    {
    	A* p = nullptr;
    	p->PrintA();
    	p->Show();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    程序会正常运行,因为传空指针没有问题,解引用空指针才有问题。


    总结

    以上就是今天的内容辣。
    在这里插入图片描述

  • 相关阅读:
    PT@古典概型@等概率模型
    行政人事的日常丨每个人心里都有一团火
    【数据结构】什么是时间复杂度、空间复杂度?看此篇文章足以
    spring和springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解
    【计算机网络】HTTPS的基础知识
    基于MAX-10 FPGA 超声波测距模块HC_SR04
    ElasticSearch之并发操作处理
    8. Spring Boot 2.5 实战 API 帮助文档 Swagger
    ElasticSerach7.15.2插件中文分词器(IK+pinyin)
    安装使用vcpkg的简易教程
  • 原文地址:https://blog.csdn.net/m0_63742310/article/details/126223251