一、类的正确定义方式
在上一篇博客中的 面向对象 编程中 , 将 现实世界中的 圆 抽象为 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;