【C++】面向对象编程引入 ② ( 面向对象编程 | 类的正确定义方式 | 类的错误定义方式 | 错误分析 )

2023-10-15 16:20:09 浏览数 (1)

一、类的正确定义方式

在上一篇博客中的 面向对象 编程中 , 将 现实世界中的 圆 抽象为 Circle 类 ;

代码语言:javascript复制
class Circle
{
public:
	double r;	// 成员变量 半径
	double p;	// 成员变量 周长
	double a;	// 成员变量 面积

	// 成员方法 设置半径
	void setR(double r1) 
	{
		r = r1;
	}

	// 成员方法 计算圆周长和面积
	void caculate()
	{
		p = 3.14159 * r * 2;
		a = 3.14159 * r * r;
	}

	// 获取圆周长
	double getP()
	{
		return p;
	}

	// 获取圆面积
	double getA()
	{
		return a;
	}
private:
protected:
};

在 Circle 类中 , 定义了 三个成员变量 r , p , a 分别表示圆的 半径 , 周长 , 面积 ;

半径 r 需要通过 setR 方法 , 设置给 r 成员变量 ;

周长 p 和 面积 a 都是通过调用 caculate 成员方法计算的 ;

声明 Circle 对象之后 , 先调用 setR 方法设置圆半径 , 然后调用 caculate 函数计算出 周长和面积 , 最终才能获取到 圆 的周长 和 面积 ;

二、类的错误定义方式

如果不定义成员方法 , 直接定义变量 , 在定义变量时 , 计算圆的周长和面积 ;

代码语言:javascript复制
class Circle
{
public:
	double r;	// 成员变量 半径
	double p = 2 * 3.14 * r;	// 成员变量 周长
	double a = 3.14 * r * r;	// 成员变量 面积
private:
protected:
};

运行完整的代码 :

代码语言:javascript复制
// 包含 C   头文件
#include "iostream"

// 使用 std 标准命名空间
//		该命名空间中 , 定义了很多标准定义
using namespace std;

class Circle
{
public:
	double r;	// 成员变量 半径
	double p = 2 * 3.14 * r;	// 成员变量 周长
	double a = 3.14 * r * r;	// 成员变量 面积
private:
protected:
};


int main() 
{
	// 定义圆对象
	Circle c;
	double r;


	// 提示输入圆半径
	cout << "输入圆半径 :" << endl;

	// 从命令行标准输入得到的数据 到 变量 r 指示的内存空间中
	cin >> c.r;
	cout << "接收到圆半径 :"<< c.r << endl;

	// 打印计算结果
	cout << "圆周长为 :" << c.p << " 圆面积为 : " << c.a << endl;

	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
}

只能得到如下结果 :

三、错误分析

定义类 Circle 时 , 没有声明对象 , 并不分配内存 ;

使用 Circle c; 代码 声明 c 对象时 , 开始在 栈内存中为 Circle 对象分配内存 ;

分配内存时 , 同时也会对 对象 中的 成员变量赋值 ;

  • 首先 , 为成员变量 double r; 分配内存 , 之后对其赋值 , 由于开发者没有在声明类时赋值 , 此时是随机值 , 可能很大 , 也可能很小 ;
  • 然后 , 为成员变量 double p = 2 * 3.14 * r; 赋值 , 在上述 r 随机值的基础上 , 计算出一个 周长 p , 此时 p 也是随机值 ;
  • 最后 , 为成员变量 double a = 3.14 * r * r; 赋值 , 在上述 r 随机值的基础上 , 计算出一个 面积 a , 此时 a 也是随机值 ;

分配内存完毕后 , Circle c; 这行代码正式执行完毕 ;

执行

代码语言:javascript复制
	// 从命令行标准输入得到的数据 到 变量 r 指示的内存空间中
	cin >> c.r;

代码 , 从命令行接收一个数值 , 赋值给 c 对象的 r 变量 , 此时 只修改 r 变量 , p 和 a 变量并没有修改 ;

下面的两行代码 , 只在初始化时执行 , 之后不会再执行 , 这就导致最后的 周长 p 和 面积 a 的值都是乱码 ;

代码语言:javascript复制
	double p = 2 * 3.14 * r;	// 成员变量 周长
	double a = 3.14 * r * r;	// 成员变量 面积

之后打印计算结果 , 从 c 对象中获取 p 和 a 值 ,

代码语言:javascript复制
	// 打印计算结果
	cout << "圆周长为 :" << c.p << " 圆面积为 : " << c.a << endl;

0 人点赞