类是对一系列具有相同性质的对象的抽象,它确定了这些对象共同的属性和行为。而对象则是类的实例,代表类的一个具体存在。类描述了所创建的对象的公共状态和行为,对象表示类的一个具体实例。
比如我们可以定义一个Student类,表示学生,该类的属性可以包括:
行为可以包括:
而一个名叫Jack的学生就是Student类的一个对象实例。
通过类和对象的抽象表示,我们可以将学生的状态(属性)和行为(方法)统一归类,从而更好地对一群学生对象进行描述。
除了类和对象,C++面向对象编程中还包含了三大特性:封装、继承和多态。
封装指将对象的属性和行为组装起来,并只向外界暴露接口,而隐藏内部的实现细节。这样可以提高程序的可维护性、灵活性和可重用性。
在C++中通过public和private等访问修饰符来实现封装:
class Student {
private:
int score; // 成绩不希望外界访问
public:
void setScore(int s) {
score = s;
}
int getScore() {
return score;
}
}
继承是指新的类可以继承Parent类的方法和属性,新的类称为子类(Derived Class),Parent类称为基类(Base Class)。
继承可以让子类直接拥有parent类的成员,thus减少重复代码的编写,增强了代码的重用性。
例如我们让GradeOneStudent类继承Student类:
class Student {
// ...
};
class GradeOneStudent : public Student {
// 继承Student的属性和方法
};
多态指一个类实例的相同方法在不同情形下有不同表现形式。
C++ 通过虚函数实现多态。虚函数是在基类中使用关键字 virtual 声明的函数。在继承类中重新定义该函数即可实现多态。例如:
class Base {
public:
virtual void print() {
cout << "Base print" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived print" << endl;
}
};
Base *p = new Derived();
p->print(); // 调用Derived的print方法,输出Derived print
类的构造函数(Constructor)和析构函数(Destructor)也是C++面向对象编程中很重要的两个概念。
构造函数是每次创建类新的对象实例时自动调用的函数。它主要用于为对象的成员变量设置初始值。
析构函数则是当对象结束其生命周期时自动执行的函数(如对象所在的函数执行结束时)。析构函数主要用于做一些清理工作。
C++类构造函数有以下特点:
示例如下:
class Student {
public:
string name;
int age;
// 构造函数
Student(string name, int age) {
this->name = name;
this->age = age;
}
}
// 创建对象时会自动调用构造函数
Student stu1("Jack", 16);
Student stu2("Lucy", 15);
析构函数语法如下:
~类名() {
// 清理工作
}
C++支持设置类的成员变量和方法的访问权限。主要有三种访问权限:
如果不加修饰符,则默认为private访问权限。
设置访问权限的主要目的是避免数据被外界随意篡改,造成程序错误。
示例:
class Student {
private:
int score;
public:
void setScore(int s) {
score = s;
}
int getScore() {
return score;
}
}
Student stu;
stu.setScore(60); // 对外提供公共接口修改数据
定义一个类通常需要以下步骤:
例如定义Student类:
class Student
{
private:
string name;
int age;
int score;
public:
Student(string n, int a);
~Student();
void printInfo();
void setScore(int s);
int getScore();
};
// 类外实现成员函数
Student::Student(string n, int a) {
name = n;
age = a;
}
void Student::setScore(int s) {
score = s;
}
// 创建并使用对象
int main() {
Student stu1("Jack", 16);
stu1.setScore(90);
stu1.printInfo();
return 0;
}
总结来说,C++面向对象的主要思想就是将数据与操作数据的函数绑定起来,统一归类,使代码模块化,利于代码的重用和维护。