C++类与对象

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C++类与对象

乔乔家的龙龙   2022-06-02 我要评论

面向过程和面向对象

类和对象是 C++ 的核心特性

我们之前的C语言就属于面向过程,关注过程,分析求解问题的步骤再通过函数调用解决问题;而现在C++是基于面向对象,关注对象,将一个问题拆分成不同对象,依靠对象之间的交互完成。

比如有一个图书馆系统,用C语言面向过程思路就是:统计图书,图书分类,同步上架图书数据,记录借阅信息。而面向对象我们会创建两个类,图书馆和用户,我们关心的是图书馆和用户之间的关系,再分别实现交互,这里简单提一下你可能不是很好理解,但是没有关系,我们后序会慢慢学习的。

类的引入

类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法,类中的数据和方法称为类的成员。定义一个类,本质上是定义一个数据类型的蓝图

最开始的老大哥在引入类的概念时是利用结构体引入的,C++ 兼容 C 的用法但同时也对C的结构体进行了升级,升级成了类,其重要标志就是结构体名称可以做类型其次结构体里面可以定义函数,,相比升级后的 struct 我们更喜欢使用 class ,class 下它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作,struct 和 class 都可以用来定义类。

访问限定符

C++引出一个概念叫封装,那他就提出一个东西叫访问限定符,访问限定符是指类里面的东西我不一定都想拿给你用,能给你用的我会用 public 关键字声明,数据就可以直接被访问,当没有 public 声明时,class 默认数据为私有(protected 和 private)类型,而 struct 不加限定符默认为公有(public)的因为他要兼容 C。

privata 私有域限制的是从域外面进行访问,锁只对外人,里面的类是可以访问到 private 的。

现阶段我们认为 protected 和 private 是一样的,他们的不同会在学习继承时体现出来。

class Student
{
public:
  …………
}

我们也可以加多个访问限定符,因为 C++ 会默认你的类型从第一个访问限定符开始到下一个结束,这个之间的区域就是对应的访问类型。如果后面没有访问限定符作用域就会在遇到 } 后结束,注意访问限定符只在编译的时候有用,在数据映射到内存后,就没有任何访问限定符上的区别了。

封装

封装,继承,多态并称面向对象的三大特性。

要讲封装就要和 C语言 做对比,比如我们C语言定义了一个栈 stack,我要对这个栈进行入栈出栈的操作,我就要在外面自己搞一个 StackPush 和 StackPop 函数,很直观的看出我们数据和方法是分离开来的,而分离开来的最大问题就是松散自由,我没有办法对他进行集中的管理。

为什么这么说,因为我一旦想进行打印这种类似的操作,除了直接调用寻找栈顶元素的函数,就是直接使用成员访问操作符写成(stack.a[stack.top-1]),别人在使用时就可能会误用,不知道是栈顶元素还是栈顶元素下一个。

封装的意义就是更好的管理,还是那句话,young man,太自由你把握不住。说难听点,C语言这种松散自由的局面只适合高素质程序员,我们不能要求每个人都有高素质去切合代码,而C++的约束才是更贴近大多数人的方式

而 C++ 首先会把数据和方法封装到一起,便于我们更好的控制,想自由访问的设计成公有,不想直接拿出来访问的设计成私有,像这样:

class Stack
{
 public:
    void Push() 
    {}
    void Pop()
    {}
private:
    int* data;
    int size;
    int capacity;
}

所以一般情况下我们设计类,成员数据或者没必要调用的函数都是私有或者保护,想给访问的蔡设计成公有,所以 C++ 封装就是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,相比C语言更加严谨。

类的作用域

类里面用来定义的空间就是类的作用域,他和命名空间类似,都有域。

注意成员函数如果在类里面定义,编译器可能会默认把他当成 inline 内联函数处理,这就暗示了实际中短小函数可以直接在类里面定义,长一点的函数定义和声明要分开。我们类里面什么都没有的就是空类,大小为 0;而当类对象没有成员变量时不能说是空类,编译会给他们分配 1 byte 表示对象存在过。

类的实例化

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

类不能存数据,类定义出的对象才能用来存数据,所以我说类就像一张图纸,有了房子才能住人。那么问题来了,房子修好了我怎么算大小呢,成员变量和函数参差不齐的,这里就要知道他是怎么考虑的,其实他计算大小时值算了成员变量,不考虑成员函数!。

其实很简单,因为外面调的每个同名函数是同一个函数,我没必要再去每个对象里面去存个他的指针,那就纯纯的浪费了,函数名实际上是存放在了内存的公共代码区。但是成员变量就要各存一份了,因为不同对象里面他们的值不一定是相同的,他们相对独立。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们