一、类
1. 类是一种用户自定义的数据类型,可以被看作是一种模板,用来创建具有相同属性和行为的多个对象
2. 类和结构体的区别:结构体的默认访问类型是public,类的是private,并且结构体只能定义成员变量,不能定义成员函数。
3. public:在类的外部可以访问,可以不使用任何成员函数来设置和获取公有变量的值。
protected:受保护成员在子类中可访问(派生类),
private:私有成员。在类的外部不可查看,只有类和友元函数可以访问私有成员。
一般在private定义数据,public定义相关函数。
4. 类的成员函数是类的一个成员,可以操作类的任意对象,可以访问对象中的所有成员
5. 类的定义方式:
成员函数可以定义在类的内部,或者单独使用范围解析运算符::来定义,在::之前必须使用类名.
访问类的public数据成员使用.,.之前是对象名。
6. 子类定义:class SmallBox:Box{ ... }
7. 继承也有三种方式:public,protected,private
8. 构造函数是类的一种特殊的成员函数,在每次创建新对象时执行
9. 析构函数:在每次删除所创建的对象时执行,不会返回任何值,也不能有任何参数,有助于在跳出程序前释放资源 ~Box();
10. 拷贝构造函数
11. 友元函数:定义在类外部,但是有权访问类的private和protected成员,友元函数不是成员函数。友元可以是函数,也可以是类。 关键字“friend”
不理解的地方:为什么参数里面要写 Box box;友元类的参数要写 Box &box ?
12. 内联函数:关键字“inline” 不太理解有什么用
13. this指针:指向当前对象的实例,每个对象都能通过this指针来访问自己的地址。是一个隐藏的指针,可以在类的成员函数中使用,用来指向调用对象。
友元函数没有this指针,因为友元不是类的成员,只有成员函数才有this指针
疑问:为什么要用this指针,在成员函数里面不是直接使用成员值就好了吗?为什么要用this->length。
理由:其实在成员函数中使用成员值是通过this来调用的,只是没有写出来,这里是显式得写出来了this指针
14. 指向类的指针:跟指向结构体的指针类似,需要使用->,在使用指针前需要初始化
15. 类的静态成员:关键字“static”,当把类的成员定义为静态的时候,意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在所有对象中共享,如果不存在其他初始化语句,在创建第一个对象的时候,所有静态数据都会被初始化为0,所以不能把静态成员的初始化放在类的定义中,需要在外部使用::来初始化。
通俗的话来说,原本创建一个对象其他成员都会有新的副本,但是静态成员只会有一个,静态成员的值可以改变,在其中一个对象中改变了其他对象调用的值也是改变后的。
16.类的静态成员函数:在对象不存在时候也可以使用::调用。静态成员函数智能访问静态成员数据,其他静态成员和类外部的其他函数。
二、继承
1. 继承允许依据一个类来定义一个类。当创建一个类时,不用重写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。已有的类称为基类,新的类为派生类。
2. 格式:class 派生类名 :< 继承方式1(public,private,protected)><基类名1>,<继承方式2><基类2>,.... {...};
3. 派生类可以访问基类的public和protected成员(通常都使用public继承)
三、重载运算符和重载函数
1. 指在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载
2. 同名函数的形参(参数的个数,类型或者顺序)必须不同,不然就是同一个函数了,在调用的时候通过参数的个数类型顺序来确定到底调用的哪一个,不能仅通过返回类型的不同来重载函数。
3. 运算符重载:可以把+重载为两个对象的相加
四、多态
1.多态:多种形态,当类存在层次关系,并且类之间是通过继承关联时,会用到多态。意味着调用成员函数的时候,会根据调用函数的对象来确定是执行哪个函数。
此时明明shape指向的是rec,但是调用的area还是shape的。
原因:调用函数的area被编译器设置为基类中的版本,这是静态多态,只需要在基类area()前加上关键字virtual就会输出rec class area。virtual int area(){},派生类中的内容不变。
2. 虚函数:在基类中使用关键字virtual 声明的函数,在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要动态连接到该函数。
3.在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。 virtual int area() = 0;
五、封装
1.封装是面向对象中把数据和操作数据的函数绑定到一起的概念,这样能避免受到外界的干扰和无用,确保安全。
2. 数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。c++通过类实现封装和数据隐藏。任何带有公有和私有成员的类都可以作为数据封装和数据抽象的实例
六、c++接口(抽象类)
1. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的
2. 设计抽象类是为了给其他类提供一个可以i继承的适当的基类,但必须在派生类中重写纯虚函数,才能被实例化(也就是创建对象)