2015级C++第7周项目 友元、共享数据保护、多文件结构

【项目1-成员函数、友元函数和一般函数有区别】参考解答
  (1)阅读下面的程序,体会注释中的说明(要运行程序,请找到课程主页并复制代码)

//例:使用成员函数、友元函数和一般函数的区别
#include <iostream>
using namespace std;
class Time
{
public:
    Time(int h,int m,int s):hour(h),minute(m),sec(s) {}
    void display1();    //display1是成员函数
    friend void display2(Time &);  //display2是友元函数
    int getHour(){return hour;}
    int getMinute(){return minute;}
    int getSec(){return sec;}
private:
    int hour;
    int minute;
    int sec;
};
void Time::display1()  //成员函数display1的实现,dispaly1前加Time::
{
    //以hour形式直接访问私有数据成员,实质是this->hour形式
    cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
void display2(Time &t)  //友元函数dispaly2的实现,不加Time::,友元并不是类的成员
{
    //虽然不是类的成员函数,却可以用t.hour的形式直接访问私有数据成员——这就是友元
    cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
void display3(Time &t)  //display3是一般函数,dispaly3前不加Time::
{
    //不能直接访问,只能用公共接口t.getHour()形式访问私有数据成员
    cout<<t.getHour()<<":"<<t.getMinute()<<":"<<t.getSec()<<endl;
}
int main()
{
    Time t1(10,13,56);
    t1.display1();  //成员函数这样调用:对象名.函数名()
    display2(t1);   //友员函数的调用和一般函数无异(但实现中可以不同)
    display3(t1);   //一般函数的调用
    return 0;
}

  (2)模仿上面的示例,完成求点类中距离的任务。你需要实现求距离函数的三种版本:分别利用成员函数、友元函数和一般函数求两点间距离的函数,并设计main()函数完成测试。

提示:此项目和例子的区别在于“距离是一个点和另外一个点的距离”,不同版本在参数上有体现。三个版本建议分开测试,也可以如示例,放在一个程序中完成。

  下面是点类的部分代码。

class CPoint
{
private:
    double x;  // 横坐标
    double y;  // 纵坐标
 public:
    CPoint(double xx=0,double yy=0):x(xx),y(yy){}
    ……//请继续写需要的代码
};

【项目2-友元类】 参考解答
  定义下面两个类的成员函数(为体验友元类,实际上本例并不一定是一个好的设计,将两个类的合并为一个DateTime,日期、时间都处理更好)

class Date; //对Date类的提前引用声明
class Time
{
public:
    Time(int,int,int);
    void add_a_second(Date &);  //增加1秒,1秒后可能会到了下一天,乃到下一月、下一年
    void display(Date &);  //显示时间,格式:月/日/年 时:分:秒
private:
    int hour;
    int minute;
    int sec;
};

class Date
{
public:
    Date(int,int,int);
    friend class Time; //Time为Date的友元类
private:
    int month;
    int day;
    int year;
};

int main( )
{
    Time t1(23,59,32);
    Date d1(12,31,2013);   //测试时,再试试Date d1(2,28,2013)会如何
    for(int i=0; i<=100; i++)
    {
        t1.add_a_second(d1);
        t1.display(d1);
    }
    return 0;
}
//下面定义两个类中的成员函数,要求不得再增加成员函数
//注意体会在Time的成员函数中可以调用Date类的私有数据成员   

【项目3-用多文件组织多个类的程序】 参考解答
  将上一周“项目2-带武器的游戏角色”用“一个项目多个文件”的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。

时间: 2024-11-02 12:50:15

2015级C++第7周项目 友元、共享数据保护、多文件结构的相关文章

2015级C++第4周项目 函数

[项目1-求最大公约数] 参考解答 (1)输入两个数,并求出其最大公约数 #include <iostream> using namespace std; //自定义函数的原型(即函数声明) int main() { int a,b,g; cin>>a>>b; g=gcd(a,b); cout<<"最大公约数是: "<<g; return 0; } int gcd(int x,int y) //定义用于求两数的最大公约数的函数

2015级C++第5周项目 类和对象

[项目1 - 三角形类雏形] [参考解答] (1)下面设计一个三角形类,请给出各成员函数的定义 class Triangle { public: void setABC(double x, double y, double z);//置三边的值,注意要能成三角形 double perimeter();//计算三角形的周长 double area();//计算并返回三角形的面积 private: double a,b,c; //三边为私有成员数据 }; int main() { Triangle

2015级C++第8周项目 数组和指针

[项目1 - 数组作数据成员]参考解答 下面是设计好的一个工资类(Salary): class Salary { public: void set_salarys( );//输入职工工资(输入-1标志着工资输入结束),工资保存到salary数组中,实际人数保存到number中: void add_salarys(int x); //给每个人涨x元工资 void sort_salarys(); //对工资由大到小排序 void show_salarys( ); //显示工资信息 private:

2015级C++第9周项目 动态存储分配及深复制

[项目1-深复制体验]参考解答 (1)阅读下面的程序,补足未完成的注释 #include<iostream> #include<cstring> using namespace std; class A { private: char *a; public: A(char *aa) { a = new char[strlen(aa)+1]; //(a)这样处理的意义在于:______________________________ strcpy(a, aa); //(b)数据成员a

2015级C++第6周项目 类的组合、静态存储

一."书面"实践项目 [项目1] "IT妹子类"的设计,作UML表达.见"云班课"中作业,每人一份,须签名. [项目2] 阅读程序,对照运行结果,领会变量的变化过程,介绍三种方法,让你读得更明白:(1)画出变量占用的内存及值的变化:(2)画出变量占用的内存及值的变化:(3)画出变量占用的内存及值的变化. (程序1) #include <iostream> using namespace std; int f(int n); int m

2013级C++第17周项目——字符串、指针应用

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-体会函数参数传递] 1.下面三段程序都试图通过定义函数,实现实际参数在必要时的交换,哪些能够实现,哪些不能实现?通过运行程序和单步执行,让自己对这一过程更加清楚,然后请在博文中给出明确的回答,并用你自己的话展开描述.) (1) #include <iostream> using namespace std; void jiaohuan(int x, int y

2013级C++第12周项目——函数应用

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1-当年第几天] 定义一个函数,其参数为年.月.日的值,返回这一天为该年的第几天.要求在main函数中输入年月日,然后调用这个函数求值,并在main函数中输出结果. [项目2-太乐了]先听故事,再编程序. 故事是这样的:话说sin和cos是一对夫妇.一天,sin去听相声了,cos在家.过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数.cos问:你是谁啊?

2015级C++第3周实践项目

[项目1:个人所得税计算器] 编写选择结构程序,输入个人月收入总额,计算出他本月应缴税款和税后收入(计算办法见附:关于个人所得税的有关背景知识). (1)自选if语句的嵌套或/和switch语句完成程序设计: (2)下面给出程序的基本框架,请从课程主页找到链接下载使用. #include <iostream> using namespace std; int main( ) { double dSalary,dTax=0,dNetIncome=0; cout<<"请输入您

2015级C++第12周实践项目 运算符重载(一)

[项目1-实现复数类中的运算符重载] 参考解答 (1)请用类的成员函数,定义复数类重载运算符+.-.*./,使之能用于复数的加减乘除 class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; imag=i;} Complex operator+(const Complex &c2); Complex operator-(const Complex &c2); Complex op