主要内容 #
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