更适合滑湿宝宝的类的定义与使用笔记

一、情境引入

为了更好地体会类和对象的定义与使用,我们以sgq御用白皮书项目1(A)的第一题为例,逐步学习。

题目:编写一个people类。该类的数据成员有年龄,身高,体重。函数成员有进食,运动,睡眠。其中进食函数使体重加1,运动函数使身高加1,睡眠函数使年龄、身高、体重各加1。要求所有成员为public公有访问权限,在主函数中通过类对象直接访问类的所有成员。

二、代码实现

        1、基于过程的程序设计:

        我们先基于过程的程序设计思路来解决这道题,分别调用几个函数,同时在函数的编写中同时用到了C++的三种函数调用方式:传值调用,传址调用以及引用调用,程序如下:

#include<iostream>
using namespace std;
int eatting(int weight);
void sporting(int* height);
void sleeping(int&, int&, int&);//三个函数的声明
int main()
{
	int age;
	int height;
	int weight;//三个数据的定义
	cout << "请分别输入年龄,身高与体重:";
	cin >> age >> height >> weight;
	weight=eatting(weight);
	sporting(&height);
	sleeping(age, weight, height);
	cout << "执行函数后各参数如下:" << endl;
	cout << age << " " << height << " " << weight << endl;
}
int eatting(int weight) {
	weight++;
	return weight;
}
void sporting(int* height) {
	*height+=1;
}
void sleeping(int& age, int& weight, int& height){
	age++;
	weight++;
	height++;
}
2、面向对象的程序设计:
概念1:对象

        客观世界任何一个事物都可以看做一个对象。题目中的一个人就可以看做一个对象,他有很多静态特征,如年龄,身高,体重等;同时它也具有诸多动态的特征,比如进食,睡眠,运动等。一个对象应当具有两个要素,属性和行为,也就是说:对象是由一组属性和一组行为构成的。这里的“属性”就是“数据”,“行为”就是“函数”。

概念2:类(class)

        类是对象的抽象,对象是类的具体实例。与结构体相类似,我们一般先声明一个类类型,然后用它去定义若干个同类型的对象。对象就是类类型的一个变量。

概念3:成员访问限定符public

类声明中的成员访问限定符public代表着“公用的”,被声明为公用的成员,既可以被本类中的成员函数所引用,也可以被类的作用域内的其他函数所引用。

概念4:成员运算符(.)

我们在结构体中"p1.age=19"的语句表示将整数19赋值给对象p1中的数据成员age。其中“.”是成员运算符,用来对成员进行限定,指明所访问的是哪个对象中的成员。访问对象成员的一般形式为“对象名.成员名”。不仅可以在类外引用对象的公用数据成员,而且还可以调用对象的公用成员函数,同样需要指出对象名。

2.1 提取静态属性

        这里我们将对象的静态属性从程序中抽离出来,形成一个people类,其中的age,height,weight就是对象具有的静态属性,为了在主函数中可以使用它们,我们在类中将其访问属性设定为public。主函数中声明类的成员后,我们利用“成员名.数据名”的语句就可以进行相关数据的引用。修改后代码如下:

#include<iostream>
using namespace std;
int eatting(int weight);
void sporting(int* height);
void sleeping(int&, int&, int&);//三个函数的声明
class people {//类的声明
public:
	int age;
	int height;
	int weight;//三个静态属性的定义
};
int main()
{
	people p1;//对象的声明(类名 对象名;)
	cout << "请分别输入年龄,身高与体重:";
	cin >> p1.age >> p1.height >> p1.weight;//(用对象名.变量名来使用public数据)
	p1.weight=eatting(p1.weight);
	sporting(&p1.height);
	sleeping(p1.age, p1.weight, p1.height);
	cout << "执行函数后各参数如下:" << endl;
	cout << p1.age << " " << p1.height << " " << p1.weight << endl;
	return 0;
}
int eatting(int weight) {
	weight++;
	return weight;
}
void sporting(int* height) {
	*height+=1;
}
void sleeping(int& age, int& weight, int& height){
	age++;
	weight++;
	height++;
}
概念5:成员访问限定符private

        与public相对,被声明为私有的成员,只能被本类中的成员函数引用,类外不能调用(友元类除外)需要注意的是:如果在类的定义中既不指定private,也不指定public,则系统默认为是私有的。

2.2 提取动态属性

        这里我们将对象的动态属性从程序中抽离出来,继续完善people类,其中的eatting,sporting,sleeping就是对象具有的动态属性,因为只有类中的成员需要调用这几个函数,所以我们将数据声明为private,把函数声明为public以供调用。由于我们将数据声明为private,导致主函数无法直接引用它的值,所以我们还需要编写input函数与output函数完成输入与输出,修改后代码如下:

#include<iostream>
using namespace std;

class people {
private://本行可以省略
	int age;
	int height;
	int weight;//三个静态属性的定义
public:
	//三个动态属性的定义以及输入输出函数的定义
	void eatting() {
		weight++;
	}
	void sporting() {
		height ++;
	}
	void sleeping() {
		age++;
		weight++;
		height++;
	}
	void input()
	{
		cout << "请分别输入年龄,身高与体重:";
		cin >> age >> height >> weight;
	}
	void output()
	{
		cout << "执行函数后各参数如下:" << endl;
		cout << age << " " << height << " " << weight << endl;
	}
};

int main()
{
	people p1;
	p1.input();//调用成员函数(成员名.函数名)
	p1.eatting();
	p1.sporting();
	p1.sleeping();
	p1.output();
	return 0;
}

概念6:作用域限定符(::)

        “::”是作用域限定符,或称作用域运算符,可以用它声明函数是属于哪个类的,如people::input()表示people类的作用域中的input函数,也就是people类中的input函数。如果没有“people::”的限定,则不是people类中的input函数。由于不同的类中可能有不同名的函数(功能也可能不同),用作用域运算符就可以加以限定,明确地指明了它是哪一个作用域的函数,也就是哪个类的函数。

2.3 在类外定义成员函数

        学习了作用域限定符后,我们可以在类体中只对成员函数进行声明,而在类的外面进行函数的定义,修改如下:

#include<iostream>
using namespace std;

class people {
private://本行可以省略
	int age;
	int height;
	int weight;//三个静态属性的定义
public:
	//三个动态属性的声明以及输入输出函数的声明
	void eatting();
	void sporting();
	void sleeping();
	void input();
	void output();
};
//在类外进行函数的定义
void people::eatting() {
	weight++;
}
void people::sporting() {
	height++;
}
void people::sleeping() {
	age++;
	weight++;
	height++;
}
void people::input() {
	cout << "请分别输入年龄,身高与体重:";
	cin >> age >> height >> weight;
}
void people::output() {
	cout << "执行函数后各参数如下:" << endl;
	cout << age << " " << height << " " << weight << endl;
}

int main()
{
	people p1;
	p1.input();
	p1.eatting();
	p1.sporting();
	p1.sleeping();
	p1.output();
	return 0;
}

前面几个代码的运行结果均如下图所示:

 

 2.4批量处理对象

        我们在2.3已经完成了基本的类的定义与使用,但只处理了一个对象的信息,我们可以多定义几个对象,完成对象的批量处理,用时我还在主函数添加了num变量来统计处理的数据并赋值给类中的number中,完成每个人的编号,再输出时就可以省略参数的部分,直接引用类内的编号即可,展示了主调函数与类沟通的方式之一。代码实现如下:

#include<iostream>
using namespace std;

class people {
private://本行可以省略
	int age;
	int height;
	int weight;//三个静态属性的定义
public:
	int number;
	//三个动态属性的声明以及输入输出函数的声明
	void eatting();
	void sporting();
	void sleeping();
	void input(int num);
	void output();
};
//在类外进行函数的定义
inline void people::eatting() {
	weight++;
}
void people::sporting() {
	height++;
}
void people::sleeping() {
	age++;
	weight++;
	height++;
}
void people::input(int num) {
	cout << "请分别输入第"<<num<<"个人的年龄,身高与体重:";
	cin >> age >> height >> weight;
}
void people::output() {//再输出时就可以直接引用类中的public成员number
	cout << "执行函数后第"<<number<<"个人的年龄,身高与体重如下:" << endl;
	cout << age << " " << height << " " << weight << endl;
}

int main()
{
	people p1, p2;
	int num=1;//编号从1开始
	p1.input(num);//把主函数中的num变量作为参数传入类中
	p1.number = num;//编号赋值
	num++;
	p2.input(num);
	p2.number = num;
	p1.eatting();
	p1.sporting();
	p1.sleeping();
	p2.eatting();
	p2.sporting();
	p2.sleeping();
	p1.output();
	p2.output();
	return 0;
}

 代码执行结果如下图所示:

三、结语:

对应的简单练习与解析已经上线啦~点击下方链接趁热打铁吧:

类的构建与输出的应用与练习-CSDN博客

  • 29
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜜汁博哥

我是大学生,给钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值