• 【C++】类和对象(一):什么是面向对象,访问限定符有哪些,类定义细节,结构体和类的关系。


    在这里插入图片描述

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
    📃个人主页 阿然成长日记 👈点击可跳转
    📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
    🚩 不能则学,不知则问,耻于问人,决无长进
    🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

    一、什么是面向对象?

    1.面向过程:

    我们刚开始接触计算机这门学科时,我们学习的第一个编程语言就是C语言,C语言是面向过程的一门语言。面向过程是一种编程思想,它以实现功能的函数开发为主,需要详细处理每一个细节,通常以函数的形式来一步一步实现整个功能。这种编程方式更侧重于解决问题的整个过程。
    例如:洗衣服这一行为:在这里插入图片描述

    2.面向对象:

    面向对象是一种编程思想,它将现实世界中的事物抽象成一个个对象,通过对象之间的交互来完成程序的设计和实现。
    它具有三大特性:封装继承多态等特性,可以更加方便地进行程序设计和维护。

    (1) 封装:指将对象的属性和方法封装在一起,对外部隐藏对象的实现细节,只暴露必要的接口。这样可以保证对象的安全性和可靠性,同时也方便了程序的调用和维护。
    (2) 继承:指通过继承已有的类来创建新的类,新的类可以继承父类的属性和方法,并且可以在此基础上进行扩展和修改。这样可以减少代码的重复,提高代码的复用性和可维护性。
    (3) 多态;指同一个方法可以在不同的对象上产生不同的行为,这样可以提高程序的灵活性和可扩展性。多态可以通过重载和重写来实现。
    例如:洗衣服这一行为:
    在这里插入图片描述
    这里面一共有四个对象:人,洗衣液,脏衣服,洗衣机
    具体实现过程是:人把洗衣液脏衣服放入洗衣机
    四个对象相互合作,从而实现洗衣服这一过程,然而,人并不知到洗衣机的具体是怎样洗衣服的,这也体现了面向对象的封装性。

    二、从struct到class

    在C语言中我们学习过结构体,它只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。在C++中,struct依然可以使用,它兼容了C语言中struct的所有用法,并将struct升级成为类。

    • 成为类后,struct中现在不仅可以定义变量,还可以定义函数。它的优势可以体现在如下代码。
      例如:在C语言中实现栈和队列中的函数名相同,但是,C语言中函数是写在全局的,不允许同名函数,必须要在函数名前加上表示。但是,使用C++的struct就可以很好的避免这个问题,
    
    //定义队列
    struct Queue
    {
    //一、定义队列
    	//头指针
    	QNode* head;
    	//尾指针
    	QNode* tail;
    	//链表长度
    	int size;
    //二、定义栈的相关方法
        //入队
    	void Push(QNode*){ }
        //出队
    	DataType Top(){ }
    };
    
    struct Stack
    {
    	//一、定义栈的相关变量
    	int* _array;
    	size_t _capacity;
    	size_t _size;
    	//二、定义栈的相关方法
    	//压栈
    	void Push(int x){ }
    	//出栈
    	DataType Top(){ }
    };
    int main()
    {
        //栈
    	Stack s;
    	s.Push(1);
    	cout << s.Top() << endl;
    	//队列
    	Queue q;
    	q.Push(6);
        cout << q.Top() << endl;
    	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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    我们可以直接使用栈Stack的各种方法和队列Queue的各种方法,不用考虑同名的问题。

    三、访问限定符

    在这里插入图片描述

    • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
    • 如果后面没有访问限定符,作用域就到 } 即类结束

    四、class的引入

    在上述例子中如果使用类来写这个栈是怎样的呢?如下代码:

    class stack2
    {
    public:
    	//压栈
    	void Push(int x) { }
    	//出栈
    	DataType Top() { }
    private :
    	int* _array;
    	int _capacity;
    	int _size;
    };
    
    
    int main()
    {
    	stack2 Ss;
    	Ss.Push(9);
    	cout << Ss.Top() << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    五、类的定义

    1.标准格式

    在C++中类的定标准格式是:

    class stack2
    {
    public:
    	//压栈
    	void Push(int x) { }
    	//出栈
    	DataType Top() { }
    private :
    	int* _array;
    	int _capacity;
    	int _size;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 类中由成员函数和成员变量组成
    • 不要忘记最后的分号。

    2.类的两种定义方式:

    (1) 声明和定义全部放在类体中

    如上面栈的代码,栈的声明和定义全部写在类中。
    需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理

    (2) 声明和定义分离

    类声明放在.h文件中,成员函数定义放在.cpp文件中,
    注意:成员函数名前需要加类名::

    void Stack::Push(int x) 
    {
    //.......
     }
    
    • 1
    • 2
    • 3
    • 4

    ::表示Push函数是Stack这个域中的。如果Push中有一个变量n,编译器会首先检查是不是当前局部变量中定义的,如果不是,则会去Stack这个域中去找。

    3.注意事项

    • class中定义的变量,惯例是private类型的。
    • class中的访问限定符如果不写,默认是private
    • 默认定义在类中的就是内联(inline
    • 函数的声明和定义很好区分。就是是否有具体实现。
    • 变量的声明就是还没有开空间,变量的定义就是为其赋初始值,已经赋值开辟空间了。
    • 的函数,声明和定义分离。
    • 短小的函数,可以直接写在类中。
    • 成员变量的命名前加_或者m_,表示这个是内部成员里的
      例如:在写一些初始化函数时,将值赋给类中的变量,这样写容易分不清楚哪个是成员变量
    	void Init(int year,int month,int day)
    	{
    		year = year;
    		month = month;
    		day = day;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    为了便于区分,建议这样写:

    	void Init(int year,int month,int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    六、class 和 struct的区别

    • C++中struct可以当成结构体使用,还可以用来定义类。
    • struct定义的类默认访问权限是public,class定义的类默认访问权限是private
    • C++中通过类可以将数据 以及 操作数据的方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知
    • struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。
    • 有时候会感觉struct是多余的,但考虑到“对c兼容”就将struct保留了下来,并做了一些扩展使其更适合面向对象,所以c++中的struct再也不是c中的那个了。
  • 相关阅读:
    膜拜,终于拿到了美团大佬分享的Netty源码剖析与应用PDF
    测试日常工作中需要具备哪些知识和能力,在需求评审时需要考虑哪些方面,在技术方面评审时需要考虑哪些方面,从什么方面进行设计测试用例
    DFS——迷宫
    小程序学习
    化合物应用-动物给药方式
    windows上编译安装pytorch的c++扩展
    开源机器人SmallRobotArm机器人源码解读
    Spring启动流程
    基于链表的滑动中值滤波器实现思路
    Vue2.0 —— Vue.set(vm.$set) 源码探秘
  • 原文地址:https://blog.csdn.net/luhaoran814/article/details/134278285