类和对象进一步讨论
-
面向对象程序设计中的几个名词:
st1是对象
display()是方法
st1.dispaly()是消息 -
构造函数:对类的成员进行初始化(为对象分配内存)
带参数/使用默认参数的构造函数
参数初始化表,更加简洁
构造函数的重载
构造函数的函数名必须与类名相同;没有类型与返回值;参数可带可不带
-
析构函数 :释放对象占用的内存空间
局部自动对象:每次调用对象所在函数同时调用构造函数,在其所在函数结束时调用解析函数
静态局部对象:调用对象所在函数时调用构造函数,在主程序结束时调用析构函数 -
先构造的后析构,后构造的先析构
(相当于一个栈,先进后出,后进先出) -
对象数组
-
对象指针 *p与p–>相同
指向对象的指针
int *p1=&t1.hour;
指向对象成员的指针
void(Time::*p3)=&Time::get_time;
this指针(隐式使用):在调用成员函数时,把对象的地址作为实参传递给this指针
实验内容
分数相加,两个分数分别是 1/5 和 7/20,它们相加后得 11/20。
方法是先求出两个分数分母的最小公倍数,通分后,再求两个分子的和,最后约简结果分数的分子和分母,即用分子分母的最大公约数分别除分子和分母。
求m、n最大公约数的一种方法为:将m、n较小的一个数赋给变量k,然后分别用(k,k-1,k-2…1)中的数(递减)去除m和n,第一个能把m和n同时除尽的数就是m和n的最大公约数。
假定m、n的最大公约数是v,则它们的最小公倍数就是m*n/v。
试建立一个分数类Fract,完成两个分数相加的功能。具体要求如下:
(1)私有数据成员
int num, den : num为分子,den为分母。
(2)公有成员函数
Fract(int a=0,int b=1):构造函数,用a和b分别初始化分子num、分母den。
int ged (int m, intn);求m、n的最大公约数。此函数供成员add)函数调用。
Fract add (Fract f):将参数分数f与对象自身相加,返回约简后的分数对象。
void show():按照num/den的形式在屏幕上显示分数。
(3)在主程序中定义两个分数对象f1和f2,其初值分别是1/5和7/20,通过f1调用成员函数add完
成f1和f2的相加,将得到的分数赋给对象f3,显示分数对象f3。
代码展示
#include <iostream>
using namespace std;
class Fract
{
int num,den; //num分子,den分母
public:
Fract(int a=0, int b=1) //构造函数赋初始值
{num=a;den=b;}
int ged(int m, int n); //求最大公约数
Fract add(Fract f); //分数相加并化简
void show()
{cout<<num<<"/"<<den<<endl;}
};
//注意类的定义最后要带分号
int main()
{
Fract f1(1,5);
Fract f2(7,20);
Fract f3;
f3=f1.add(f2);
f3.show();
return 0;
}
int Fract::ged(int m, int n)
{
int k;
if (m>n)
k = n;
else
k = m;
for(;k>0;k--)
{
if ((m%k==0)&&(n%k==0))
break;
}
return k;
}
Fract Fract::add(Fract f)
{
Fract f4;
int a,b;
//den在C++被执行时为this—>den
a = (den*f.den)/ged(den,f.den);
//求两分数分母的最小公倍数 a=m*n/k(k是m、n的最大公约数)
//通分
f4.den=a; //分母直接用最小公倍数替换
f4.num=(a/den)*num + (a/f.den)*f.num; //分子为两分子分别乘相应倍数后相加
//约分
b = ged(f4.num,f4.den); //通分相加后,分子分母的最大公约数
f4.num=f4.num/b;
f4.den=f4.den/b;
return f4;
}