关于“面向对象”
其实在C语言中就有“封装”的思想,比如解决一个问题时通过创建若干个子函数来模块化地完成各个功能、或是LinuxC中通过分类细化编译流程进行Makefile工程管理,这其实都是“包装”“封装”的思维逻辑。
因为任何一件事我们不可能是每一次都事无巨细地、从头到尾地去走一遍流程,我们希望可以通过“封装”这种操作来达到类似于一劳永逸的效果,这是可以实现的。
这就是面向对象编程语言的绝对核心,“类”的意义。
1.类
将一类事物根据其特点共性抽象成一个集合,这就是类。类一般有属性与行为两部分。根据类创建的变量在C++中称作“对象”,对象是类的实例化,类是对象的抽象化。
EX——C中结构体与C++中类的区别
①初始化方式不同,C语言中的结构体可以通过变量访问具体成员、大括号逐个初始化等方式,而C++中不能采用大括号逐个初始化的方式,一般是采用构造函数。
②C语言中的结构体成员没有访问权限的限制,而C++ 中的类存在public,
private,protected三种访问权限的限制。
EX——C中结构体与C++ 中结构体的区别
①首先C语言中不允许空结构体,且不能有“函数”,而C++则相反,可以为空且可以由函数。
②其次,C语言中对空结构体分配的内存是0字节,而C++是1字节。
1.1类的默认属性
以下均以Student为类名举例。
① 构造函数
所有类中都有的、在类被实例化时调用的、无参无返回值的函数,一般被用作对象的初始化。
格式:
类名()
{}
例:
Student(){}
② 析构函数
所有类中都有的、在类的生命周期结束时调用的、无参无返回值的函数,一般被用作回收类对象所占的内存空间。
格式:
~类名()
{}
例:
~Student(){}
③ 拷贝构造
所有类都有的、参数为该类的引用类型、无返回值的函数,一般在用该类已存在的一个对象来拷贝到得一个对象时使用。
格式:
类名(某个对象的引用)
{}
例:
Student(Student &b)
{}
EX——关于深拷贝与浅拷贝
当一个对象中存在指针类型的变量时,如果单纯地复制一个对象的所有信息并用以创建一个新对象(即浅拷贝),指针变量会被复制一次,那么就存在两个指向同一片内存空间的指针。这时,若对这两个对象进行回收,自然会出错。
所以,这种情况下应当采用将指针所指向空间内的内容也一并拷贝的方式,即深拷贝。
关于修饰符
① static 静态化
---》静态化类的变量成员:
被修饰的类变量属于该类,而不属于某一个具体的实例化对象,会在编译时分配一次内存,往后实例化对象时不会再创建第二次静态变量。
即实现了 数据(变量)的共享。
访问方式:
类名::静态变量名
对象名.静态变量名
---》静态化类的成员函数:
同上。
访问方式:
同上。
注意:静态化的成员函数没有this指针,因而不能访问类中的非静态成员,只能访问同为静态化数据的静态变量。---》访问相同的 / 被父类型访问
② const常量化
---》常量化类的变量成员:
被修饰的变量成员不可修改。
初始化方式:
类的构造函数后面使用初始化列表。
例:
Student():b(b),a(a)
{}
---》常量化类的成员函数:
这种情况实际上是修饰this指针,即 const 类名* this const,意为调用的对象不可修改其内存空间中的任何数据,只能访问(看一看)。
注意:被const修饰的成员函数因为this指针的类型限制,只能访问参数类型匹配的成员函数。---》访问相同的 / 被访问
---》常量化类:
被修饰的类对象只能调用同被const修饰的成员函数。
EX——mutable修饰符
如果想要在已被const修饰的成员函数中修改类的数据,可以使用mutable修饰符。在想要改变的数据前面加上mutable即可。
关于类外访问
如果想要在类的外部访问类的数据成员,可以用到“友元”。即在类的内部写下想要与其做朋友的(friend)函数名或类名即可。