一、类和对象
类:描述一类事物的属性和行为的自定义的数据类型(类似于结构体的struct,但和结构体相 比,里面可以添加函数,且不用typedef就能实现它的功能)。
定义方式:class 类名
类在定义的同时,其内还会有“访问限定符”的概念。
访问限定符:包含public和private/protected。
public:修饰的成员既可以在类内被访问,也可以在类外被访问。
private/protecte:修饰的成员之内在类内被访问。
对象:用类这种自定义的数据类型定义的变量。
实例化对象:用类的数据类型定义变量的过程。
方式:类名 对象名
二、封装
封装:把一类事物的属性和行为用类这种自定义的数据类型包裹起来,将需要隐藏的隐藏(private/protected)起来,将需要暴露的暴露(public)出来,这一过程称为封装。
三、this指针
this指针:指向当前类的对象,谁正在调用成员函数,谁就是当前类的对象
this指针在不同位置除,访问的方式有所不同,如下:
类内:在成员函数中可以直接被访问
类外:必须先有对象,然后通过对象进行访问
总结:不管在类内还是类外,访问成员必须要有对象,通过对象.成员或者对象指针->成员
的方式进行访问
四、构造函数和析构函数
1.构造函数
概念:在实例化对象时,由系统自动调用,用来给成员变量初始化的函数
注意:在我们没有自定义构造函数时,系统会提供一个无参的构造函数;但当我们自定义好之后,系统就不再提供。
构造函数在定义的时候要注意一下几点
1.构造函数名要和类名相同
2.构造函数无返回值
3.构造函数参数可以有多个,也可以重载
在构造函数中,会存在默认构造函数的概念,它分为一下三种情况
1.用户本身没有定义,因此会由系统自动提供
2.用户自定义,但构造函数无参数
3.用户自定义,构造函数有参数,且所有的参数都有默认值
要注意的是,以上三种默认构造函数,在main函数调用时,只能选其中一种进行调用(三者是互斥的)。它们的共同点是:在main函数调用的时候只需要实例化对象即可,不需要传参。
2.析构函数
概念:当一个对象生命周期结束的时候,就需要调用析构函数
注意:通构造函数一样,如果用户没有自定义,会由系统提供,如果定义了,系统就不再提供。
定义方式:~ 类名
析构函数是无参、无返回值的。
作用:回收资源,如当在构造函数中在堆区申请空间,就需要到析构函数中去释放。
五、new和delete运算符
1.new运算符
概念:在堆区申请空间(类似于malloc)
2.delete运算符
概念:释放堆区的空间(类似于free)
C语言中malloc、free和C++中new、delete的对比:
C++ C语言
一般形式:
开辟空间:int *p = new int; int *p = (int *)malloc(sizeof(int));
释放空间:delete p; free(p);
数组形式:
开辟空间:int *p = new int[5]; int *p = (int *)malloc(sizeof(int)*5);
释放空间:delete []p; free(p);
new、delete和malloc、free的区别:
1.malloc和free是标准c库的函数,new和delete是c++的运算符
2.malloc需要强制类型转换,而new不需要
3.malloc需要计算开辟空间的大小,而new不需要
六.static在C++中的使用
c语言中static的作用:
1.修饰局部变量时延长了局部变量的生命周期
2.修饰全局变量时限制了全局变量的作用域
3.修饰函数时限制了函数的作用域
c++中static的作用:
static修饰成员变量:
1.必须在类内声明,在类外定义(原因:static修饰的变量在编译阶段就会开辟空间,而类在编译解决没有空间,成员变量又是类的一部分,有矛盾,而声明不分配空间,定义才分配空间)。
2.先于对象而存在,一个类只有一份,所有对象共享,不占某个对象内存空间大小。
3.在类外可以直接通过类名加作用域的方式进行访问(静态成员变量必须在public才行)。
static修饰成员函数:
1.可以直接通过类名加作用域访问
2.没有this指针,不能访问非静态成员
3.非静态的成员函数可以访问静态成员
七、const在C++中的使用
const修饰的成员函数:
1.const修饰的成员函数中不能修改任何成员变量的值
2.const看似在修饰成员函数,实则是在修饰这个成员函数的第一个形参this
3.常成员函数(被const修饰的成员函数)只能调用常成员函数
const修饰的对象:
1.不能作为左值
2.只能调用const修饰的成员函数
3.不能修改成员变量的值
4.非常成员可以调用常成员