跳至正文
View Categories

3 min read

主要内容 #

1. 类 #

什么是【类】?
先来回顾一下【结构体】

/* 定义一个结构体 */
struct student
{
    student();  // 稍后说明
    ~student(); // 稍后说明

    string m_name;
    int    m_age;
};

【类】其实和【结构体】基本上一样,但是C++程序员一般更倾向于使用【类】。一般仅仅使用【结构体】定义一些简单的“组合”。

2. 成员变量和访问控制 #

请打开 DevC++ ,定义一个类和一个结构体,均包含两个成员

string m_name;
int    m_age;

例程:

struct studentA
{
    string m_name;
    int    m_age;
};

class studentB // 形式上,和结构体只有 class 和 struct 的差别
{
    string m_name;
    int    m_age;
};

int main()
{
    studentA sta;
    studentB stb;

    sta.m_name = "A";
    stb.m_name = "A"; // 【注意】不可访问

    return 0;
}

为了解决上面的【不可访问】问题:

struct studentA
{
    string m_name;
    int    m_age;
};

class studentB // 形式上,和结构体只有 class 和 struct 的差别
{
public:             // 【1】作用范围是一直往下
    string m_name;
    int    m_age; 

protected:         // 【2* 了解即可】class 之外不可访问,但是子类中可以
    int    m_English;

private:          // 【3】class 之外不可访问
    int    m_Chinese;

};

int main()
{
    studentA sta;
    studentB stb;

    sta.m_name = "A";
    stb.m_name = "A"; // 【注意】可访问

    stb.m_English = 98; // 【注意】不可访问
    stb.m_Chinese = 99; // 【注意】不可访问

    return 0;
}

【为什么要设置访问权限】
比如有一个黑客,进入了学习的成绩系统,你希望他可以随意修改学生的成绩吗?那么谁应该有限期修改学生成绩呢?
注意解释【class之内】和【class之外】的概念。

3. 成员函数 #

#include < iostream >
using namespace std;

class studentB // 形式上,和结构体只有 class 和 struct 的差别
{
public:
    void set_name(string name) // 【1】 可以使用函数来访问 private 成员
    { 
        m_name = name; // 【1】【函数属于class 之内】
    }

    string get_name(); //【2】【声明和实现可以分离】

    void set_English(int sc) {  m_English = sc;   }
    void set_Chinese(int sc) {  m_Chinese = sc;   }

    double get_average_score() // 求平均分
    {
        return 0.5*(m_English + m_Chinese);
    }

private:
    string m_name; 
    int    m_English;
    int    m_Chinese;

};



string studentB::get_name() //【2】【声明和实现可以分离】【注意写法】
{
    return m_name;          //【2】【声明和实现可以分离】【和普通函数类似,也可以将声明,写在其他文件中】
}



int main()
{
    studentB stb;

    stb.set_name("A");
    stb.set_English(98);
    stb.set_Chinese(99);


    double a = sta.get_average_score();
    cout << a << endl;

    return 0;
}

成员函数的定义和声明,均属于【class之内】。

4. 构造函数 #

#include < iostream >
using namespace std;

class studentB
{
public:
    studentB(string name, int en, int ch)
    {
        m_name = name;
        m_English = en;
        m_Chinese = ch;
    }

    double get_average_score() // 求平均分
    {
        return 0.5*(m_English + m_Chinese);
    }

private:
    string m_name; 
    int    m_English;
    int    m_Chinese;

};

int main()
{
    //studentB stb;
    studentB stb("xiaoming", 77, 85); // 【注意】这就是构造函数的作用,是不是和【初始化】很像?

    double a = sta.get_average_score();
    cout << a << endl;

    return 0;
}

【构造函数】是类的【成员】刚刚建立的时候,发生的事情。

5. 析构函数 #

#include < iostream >
using namespace std;

class studentB
{
public:
    studentB(string name, int en, int ch)
    {
        m_name = name;
        m_English = en;
        m_Chinese = ch;

        m_comments = new char[500]; // 不做要求,仅以此为例。表示动态申请内存,这需要程序员手动释放。
    }

    ~studentB()
    {
        cout << "goodbye!" << endl;
        delete[] m_comments; // 【析构函数】:在对象消亡时,手动释放申请的内存。
    }


    double get_average_score() // 求平均分
    {
        return 0.5*(m_English + m_Chinese);
    }

private:
    string m_name; 
    int    m_English;
    int    m_Chinese;

    char*  m_comments;     // 假设:用于填写学生评语。

};

int main()
{
    //studentB stb;
    studentB stb("xiaoming", 77, 85); // 【注意】这就是构造函数的作用,是不是和【初始化】很像?

    double a = sta.get_average_score();
    cout << a << endl;

    return 0;
}

【构造函数】是类的【成员】准备消亡的时候,发生的事情。

6. 类存在的意义 #

  • 【类】号称 C++ 的灵魂
  • C++ 被称为【面向对象】语言,就是因为支持【类】。而向C,被称为【面向过程】的语言。
  • 举个例子吧,我现在有个计划,要去北京,【面向对象】语言是直接给你一个车,然后你自己设定路线去北京就好,而【面向过程】语言是需要你自己制造零件,自己组装好车,然后再自己设定路线,最后到达北京。【面向过程】语言比较费劲,但是程序的效率很高。

    【C语言是基础,C语言也可以实现面向对象的】

  • 【类】主要用于复杂系统开发之中,大神们写好了【类】,其他人就可以使用,大大提高了工作效率。
  • 习题 #

    请定义一个类,book。
    book 包含的基本信息有:书名、价格、作者。
    
    请从窗口输入两本书的基本信息,然后输出两本书的平均价格。
    
    【样例输入】
    SanGuoYanYi
    20
    LuoGuangZhong
    XiYouJi
    35
    WuChengEn
    
    【样例输出】
    27.5