类
c++ 是一种人机交互的面向对象的编程语言,面向对象思想主要体现在 类 上。
类是具有相同属性和相同行为的对象的集合, 具有封装,继承,多态的特性。
类的定义
class 类名 { };
封装
例如:人就是一种类,相同属性有年龄,性别等。相同行为有吃饭,喝水等。
把这些相同属性和相同行为封装到一个结构中就类。
class people{
public:
int age;
char sex;public:
void eat();
void drink();
};
同样,动物也是一种类,相同属性也有年龄,性别等。相同行为也有吃饭,喝水等。
class animal{
public:
int age;
char sex;public:
void eat();
void drink();
};
继承
这时,发现人和动物的相同属性和行为可以再提取封装成一种类。
class object {
public:
int age;
char sex;public:
void eat();
void drink();
};
有了 object 类,再定义人和动物的类的时候,可以继承object 类。
class people:pulic object {
};
class animal :pulic object {
};
类 people 和 类 animal 中没有定义属性(年龄,性别)和 行为(吃饭,喝水),但是继承类object ,所以类 people 和 类 animal同样有了属性(年龄,性别)和 行为(吃饭,喝水)。
这只是一层继承,如果把类 people 和 类 animal继续往下区分,还可以多层继承。
class object 是基类,类 people 和 类 animal是子类也叫派生类。
多态
class animal :pulic object {
public:
void call ();//动物叫声
};class dog:animal {
public:
void call ();//狗叫声:汪汪
};class cat:animal {
public:
void call ()//猫叫声:喵喵
};
动物有叫声,不同的动物有不同叫声,这就是多态。
到此为止,我们对类的框架有了一个大体的认识,接下来是到类的内部。
类的属性和行为
类内部知识点:权限,构造函数,析构函数,内联函数,友元函数等等
访问权限
三种权限:私有权限 private,保护权限 protected, 公有权限 public (如果没有标注权限,默认是私有权限private)
权限范围:public > protected > private
权限可以作用于 属性和行为,还有派生类(继承权限)。
私有权限:将类属性和行为作为的私有成员,不能在类外访问;
保护权限:将类属性和行为作为的保护成员,不能在类外访问但是可以被继承;
公有权限:将类属性和行为作为的公有成员,可以在类外访问。
私有继承:将基类保护和公有的成员作为派生类的私有成员,不能在类外访问;
保护继承:将基类保护和公有的成员作为派生类的保护成员,不能在类外访问但是可以被继承;
公有继承:将基类保护和公有的成员作为派生类的公有成员,可以在类外访问。
构造函数
构造函数有 默认构造函数,拷贝构造函数,移动构造函数
构造函数没有返回值,如果类中没有定义的构造函数,默认有 默认构造函数。
class object {
public:
int age;
char sex;public:
object(int age,char sex);//构造函数 声明
object(object & obj);//拷贝构造函数 声明
object(object && obj) noexcept; //移动构造函数 声明~object();//析构函数 声明
};object::object(int a,char s){ //构造函数 定义
age =a ;
sex =s ;
}object::object(object & obj){ //构造函数 定义
age =obj.age ;
sex =obj.sex;
}object::object(object && obj) noexcept{ //移动构造函数 定义}~object() { //析构函数 定义
}
构造函数可以对成员变量进行初始化, 可以在函数体内进行,也可以用初始化列表。
object :: object(int a,char s) :age(a), sex(s) { //构造函数 定义}
拷贝构造函数:深拷贝和浅拷贝(只是对指针的拷贝,浅拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。)
object :: object(object & obj){ //拷贝构造函数 定义
age =obj.age ;
sex =obj.sex ;
}
拷贝构造函数使用场景:
1.用一个对象初始化另一个对象;
2.函数参数是类对象(即值传递。引用传递除外);
3.函数返回值是类对象。
移动构造函数
原型:类名(类类型 &&); 以object类为例,其移动构造函数声明如下:
object ( object && obj ) noexcept;
使用场景:
用一个临时对象(即将被销毁的对象)去初始化另一个同类型的对象。
主要是针对类中有指针变量的情况(类似浅拷贝,临时对象的指针变量置空NULL)。
析构函数
原型:~类名(); 以object类为例,其析构函数声明如下:
~object(){
}
类中含有指针变量,需要在析构函数中处理,以防内存泄漏。
内联函数
1.在类中定义的成员函数,默认就是内联函数。
2.在类中声明的成员函数 前加上关键字 inline,类外定义的成员函数前 也加上inline,该成员函数是内联函数。
内联函数作用:减少了调用函数的步骤,而是直接替换。
友元函数
1.在类中声明的函数前加上关键字 firend. 不是类的成员函数。
以object类为例,其声明如下:
firend void show();// 类中声明
void show(){ // 类外定义
}
友元函数的作用:可以访问类的私有成员和保护成员。
同样,类中也可以有友元类,作用同友元函数一样。
虚函数
1.在类中声明的函数前加上关键字 virtual
以object类为例,其声明如下:
virtual void call();// 声明
虚函数作用:通过基类指针指向不同的派生类对象,也就是动态绑定,实现多态特性。
纯虚函数
1.在类中声明的函数前加上关键字 virtual,直接=0;没有函数体。
以object类为例,其声明如下:
virtual void call() = 0;
类中含有纯虚函数,该类是抽象类,不能实例化。
在其派生类中必须对该函数重定义,否则该派生类也成了 抽象类。