c++第三章面向对象1-抽象和封装

118 阅读3分钟

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.gettersetter一般是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; 
    
}