主要内容 #
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语言也可以实现面向对象的】
习题 #
请定义一个类,book。 book 包含的基本信息有:书名、价格、作者。 请从窗口输入两本书的基本信息,然后输出两本书的平均价格。 【样例输入】 SanGuoYanYi 20 LuoGuangZhong XiYouJi 35 WuChengEn 【样例输出】 27.5