01.从面向过程到面向对象
02.抽象与UML图
1.抽象Abstract
面向对象四个特性之一,分析问题并识别出各个实体及其属性和行为
2.UML类图
识别出问题中各个实体(属性+行为)后,需用规范的方式描述
03.类和对象
1.定义类
定义一个类 = 定义它的属性(成员变量)+行1为(成员函数)
通常格式
class 类名{
访问控制修饰符:
定义成员变量
定义成员函数
};
[注1]以圆形举例
1.半径:浮点数
2.构造函数()
计算面积()
计算周长()
class Circle{
public:
float radius;
Circle(float radius){
this->radius = radius;
}
float getS(){
return 3.14 * radius * radius;
}
float getC(){
return 2 * 3.14 * radius;
}
};
[注2]以矩形举例
1.长:浮点数
宽:浮点数
2.构造函数()
计算面积()
计算周长()
class Rectangle{
public:
float a;
float b;
Rectangle(float a,float b){
this->a = a;
this->b = b;
}
float getS(){
return a * b;
}
float getC(){
return 2 * (a + b);
}
};
[注3]完整代码
class Circle{
public:
float radius;
Circle(float radius){
this->radius = radius;
}
float getS(){
return 3.14 * radius * radius;
}
float getC(){
return 2 * 3.14 * radius;
}
};
class Rectangle{
public:
float a;
float b;
Rectangle(float a,float b){
this->a = a;
this->b = b;
}
float getS(){
return a * b;
}
float getC(){
return 2 * (a + b);
}
};
int main(){
Circle c1(1.5f),c2(3.f);
Rectangle r1(3.f,2.f), r2(4.f,3.f);
cout << "c1的半径" << c1.radius << endl;
cout << "c1的周长" << c1.getC() << endl;
cout << "c1的面积" << c1.getS() << endl;
cout << "c2的半径" << c2.radius << endl;
cout << "c2的周长" << c2.getC() << endl;
cout << "c2的面积" << c2.getS() << endl;
cout << "r1的长" << r1.a << endl;
cout << "r1的宽" << r1.b << endl;
cout << "r1的周长" << r1.getC() << endl;
cout << "r1的面积" << r1.getS() << endl;
cout << "r2的长" << r2.a << endl;
cout << "r2的宽" << r2.b << endl;
cout << "r2的周长" << r2.getC() << endl;
cout << "r2的面积" << r2.getS() << endl;
}
2.特殊的成员函数:构造函数与析构函数
构造:对象实例化时,分配空间后,完成对象的构造工作(如初始化城成员变量,分配资源等)
析构:对象生命周期结束后,回收空间前,完成对象的清理工作(如释放资源等)
代码
class A{
public:
int n;
char* data = nullptr;
//(有参)构造函数
A(int n){
this->n = n;
data = (char*)malloc(100);
}
//析构函数
~A(){
free(data);
}
}
3.this指针
this的含义:这个
this指针在类定义内部使用,指向当前对象
04.封装
封装:面向对象的四个特性之一,将类的一些成员变量或方法藏起来,不允许外界直接操作
1.getter/setter方法
1.为某些私有成员变量提供外部读写方法:get_xxx(读)/set_xxx(写)
2.getter和setter一般是public的
[注1]getter函数的通常格式(设xxx的数据类型为T)
class Book{
private:
string name;
int count;
public:
Book(){...}
//getter函数的通常格式
//const表示为常成员函数,不能修改类成员变量
T get_xxx() const{
return xxx;
}
}
[注2]setter函数的通常格式(设xxx的数据类型为T)
class Book{
private:
string name;
int count;
public:
Book(){...}
//setter函数的通常格式
//const表示为常成员函数,不能修改类成员变量
void set_xxx(const T& xxx){
this->xxx = xxx;
}
}
[注3]完整代码
class Book{
private:
string name;
int count;
public:
Book(string name){
count = 0;
this->name = name;
}
int get_count() const{
return count;
}
string get_name() const{
return name;
}
void set_count(int count){
if(count < 0){
count = 0;
}
this->count = count;
}
void set_name(const string& name){
this->name = name;
}
//增加库存
void add_count(){
count++;
}
};
int main(){
Book book1("高等数学"),book2("数据结构");
cout << book1.get_name() << "库存"
<< book1.get_count() << endl;
cout << book2.get_name() << "库存"
<< book1.get_count() << endl;
book1.add_count();
cout << book1.get_name() << "库存"
<< book1.get_count() << endl;
}