C++——类和面向对象
1.什么是类?
总的来说,类是抽象(人),对象是实例(张三)。C++中用class定义类,在类中定义成员变量和成员方法。
2.封装
在了解什么是封装前,首先需要知道访问修饰符。访问修饰符指定了成员变量和成员方法的可见性和访问权限,包括:
public(公有):类的内部、派生类(子类)的内部、类的对象外部都可以访问
private(私有):只能在定义该成员的类的内部访
protected(受保护):只能在定义该成员的类的内部、派生类汇总访问
在代码中,可以通过封装隐藏对象中一些不希望被外部所访问到的属性或方法,具体的做法是:
- 将对象的属性名,设置为
private
,只能被类所访问 - 提供公共的
get
和set
方法来获取和设置对象的属性
3.构造函数
在之前链表中已经使用过构造函数,用来初始化对象的成员变量。构造函数与类同名,没有返回类型,在对象创建时自动调用。
构造函数的基本语法包括:
- 函数名:与类名相同
- 参数列表:用于在创建对象时传递初始化信息,可以有0个或多个
- 函数体:用于执行构造函数的初始化逻辑
//带参数的构造函数
Person(int personAge, const string& personName) {
age = personAge;
name = personName
}
此外还有构造函数的成员初始化列表写法,这种写法允许在进入构造函数主体之前对类成员进行初始化。
Person(int personAge, const string& personName) : age(personAge), name(personName) {
}
4.继承
为了避免编写重复性的代码,可以采用“继承”的方式使得一个类获取到其他类中的属性和方法。在定义类时,可以在类名后指定当前类的父类, 子类可以直接继承父类中的所有属性和方法。在子类中需要对父类定义的方法进行重写,重写通过关键字override实现。
5.多态
多态允许不同的对象使用相同的接口进行操作,但在运行时表现出不同的行为。C++中实现多态性的方法是通过virtual
虚函数。
class Shape {
public:
//定义虚函数
//const = 0 表示纯虚函数,该类不能被实例化,要求派生类必须实现这两个函数
virtual double CalculateArea() const = 0;
virtual string GetType() const = 0;
};
class Rectangle : public Shape{
private:
int width;
int height;
public:
Rectangle(int width , int height) :width(width) , height(height) {}
double CalculateArea() const override{
return static_cast<double>(width * height);
}
string GetType() const override{
return "Rectangle";
}
};
class Circle : public Shape{
private:
int radius;
public:
Circle(int radius) : radius(radius) {}
double CalculateArea() const override{
return 3.14*radius*radius;
}
string GetType() const override{
return "Circle";
}
};
顺便总结一下之前学习中的疑问,有一些还需要继续加深理解。
1. ->操作符的作用:通过指针访问所指向对象的成员。指针—钥匙,对象—房间,成员—房间内的物品,因此->的过程就像用钥匙打开房间并取出里面的物品。
eg.之前在链表中:
//插入新节点
ListNode *newNode = new ListNode(val);
cur -> next = newNode;
cur = cur -> next;
指针cur最开始为虚拟头节点,它指向第一个链表节点。因此cur -> next访问了第一个链表节点中的next成员,并将它指向新节点。
2.const的作用
声明常量: const int a = 10; //a的值不能更改
限定只读:const Shape* p
:p指向的Shape对象不能通过p修改
Shape* const p
:p本身不能改(但p指向的对象可以改)
3.&表示引用
引用 = 已有变量的别名,两者指向同一内存。好处:避免直接复制数据,直接操作原对象。