C++程序设计-第7周 静态成员、友元、类模板

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565

第一部分 阅读程序 要阅读的程序中存在语法错误,请将其找出来,能用自己的话说清梦理由

#include <iostream>
#include <string>
using namespace std;
class Box
{
 public:
 Box(int h,int w,int l):height(h),width(w),length(l){}
 int volume( ){return height*width*length;};
 private:
 static int height;  //静态的数据成员
 int width;
 int length;
};
int main()
{
    Box b(2,3,4);
    cout<<"volume is "<<b.volume()<<endl;
    return 0;
}

第二部分 上机实践
【项目1-静态成员应用】设计含有静态数据成员和成员函数的Time类:静态数据成员类中所有的对象共有的数据

class Time{
public:
	Time(int=0,int=0,int=0);
	void show_time( ); //根据is_24和from0,输出适合形式-20:23:5/8:23:5 pm/08:23:05 pm
	void add_seconds(int); //增加n秒钟
	void add_minutes(int); //增加n分钟
	void add_hours(int); //增加n小时
	static void change24();  //改变静态成员is_24,在12和24时制之间转换
	static void changefrom0();   //改变静态成员from0,切换是否前导0
 private:
	static bool is_24; //为true时,24小时制,如20:23:5;为flase,12小时制,显示为8:23:5 pm
	static bool from0; //为true时,前导0,8:23:5显示为08:23:05
	int hour;
	int minute;
	int sec;
};
//下面写出静态成员的初始化及各成员函数的定义……
int main( ) //运行结果如图所示
{  }

【项目2-成员函数、友元函数和一般函数之区别】阅读下面的程序,仔细阅读注释。然后模仿完成求点类中距离的任务。

//例:使用成员函数、友元函数和一般函数的区别
#include <iostream>
using namespace std;
class Time
{
public:
	Time(int h,int m,int s):hour(h),minute(m),sec(s){}
	void display1(); //成员函数声明
	friend void display2(Time &);  //友元函数声明
	int getHour(){return hour;}
	int getMinute(){return minute;}
	int getSec(){return sec;}
 private:
	int hour;
	int minute;
	int sec;
};
void display3(Time &);  //一般函数声明
void Time::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)  //一般函数的实现,dispaly1前加Time::
{
	//不能直接访问,只能用公共接口t.getHour()形式访问私有数据成员
	cout<<t.getHour()<<":"<<t.getMinute()<<":"<<t.getSec()<<endl;
}
int main()
{
	Time t1(10,13,56);
	t1.display1();  //成员函数这样调用
	display2(t1);   //友员函数的调用和一般函数无异
	display3(t1);   //一般函数的调用
	system("pause");
	return 0;
}

    你需要完成的任务是,利用成员函数、友元函数和一般函数,实现三个版本的求两点间距离的函数,并设计main()函数完成测试。此项目和例子的区别在于“距离是一个点和另外一个点的距离”,参数个数上有体现。下面是点类的部分代码。

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

【项目3-友元类】定义下面两个类的成员函数(为体验友元类,实际上本例并不一定是一个好的设计,将两个类的合并为一个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,25,2012);
    for(int i=0; i<=80; i++)
    {
        t1.add_a_second(d1);
        t1.display(d1);
    }
    return 0;
}
//下面定义两个类中的成员函数,要求不得再增加成员函数
//注意体会在Time的成员函数中可以调用Date类的私有数据成员

【项目4-复数模板类】阅读P314的例10.1。该例实现了一个复数类,但是美中不足的是,复数类的实部和虚部都固定只能是double型的。可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时用的实际类型。
(1)要求类成员函数在类外定义。
(2)在此基础上,再实现减法、乘法和除法
你可以使用的main()函数如下。

int main( )
{
	Complex<int> c1(3,4),c2(5,-10),c3;
	c3=c1.complex_add(c2);
	cout<<"c1+c2=";
	c3.display( );
	Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6;
	c6=c4.complex_add(c5);
	cout<<"c4+c5=";
	c6.display( );
	//下面测试减法、乘法和除法
  ……
	system("pause");
	return 0;
}

【项目5-模板类中使用友元函数】友元函数提供了一种非成员函数访问私有数据成员的途径,模板类使类中的数据成员的类型变得灵活,这两种技术可以结合起来用。要求在项目4的基础上能够支持用友员函数实现的加法。用于测试的main()函数如下:

int main( )
{
	Complex<int> c1(3,4),c2(5,-10),c3;
	c3=c1.complex_add(c2);  //需要在模板类中有一个成员函数支持加法运算,有一个形参
	cout<<"c1+c2=";
	c3.display( );
	Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6;
	c6=c4.complex_add(c5);
	cout<<"c4+c5=";
	c6.display( );
	Complex<int> c7;
	c7=add_complex(c1,c2);  //需要在模板类中有一个友员函数支持加法运算,有两个形参
	cout<<"c1+c2=";
	c7.display( );
	system("pause");
	return 0;
}
时间: 2024-09-11 08:47:12

C++程序设计-第7周 静态成员、友元、类模板的相关文章

C++利用静态成员或类模板构建链表的方法讲解_C 语言

直接上代码了,说明看注释就可以: 利用静态成员构建链表 #include <IOSTREAM.H> class Node { public: Node(int val, Node* next):val(val),next(next){} //~Node(){cout<<"del "<<val<<endl;} static void showAll();//打印全部节点的值 static void insertHead(int);//头插

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable  成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

C++第7周项目3 - 友元类

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8775137 [项目3-友元类]定义下面两个类的成员函数(为体验友元类,实际上本例并不一定是一个好的设计,将两个类的合并为一个DateTime,日期.时间都处理更好) class Date; //对Date类的提前引用声明 class Time { public

C++第7周(春)项目4 友元类

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目4-友元类] 定义下面两个类的成员函数(为体验友元类,实际上本例并不一定是一个好的设计,将两个类的合并为一个DateTime,日期.时间都处理更好) class Date; //对Date类的提前引用声明 class Time { public: Time(int,int,int); void add_a_second(Date &);

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 voi

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

C++之友元:友元函数和友元类详解_C 语言

一.友元介绍我们知道,类的成员函数可以访问同类的其他成员函数,包括公有.私有和保护成员.而类的外部函数只能访问类的公有成员. 友元是一种允许非类成员函数访问类的非公有成员的一种机制.可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元. 友元函数友元类 二.友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend  类型 友元函数名(参数表);友元的作用在于提高程序的运行效率 友

C++学习摘要之六:友元函数与友元类

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为 公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分,但 又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数.除了友元函数外,还有 友元类,两者统称为友元.友元的作用是提供了工序的运行效率,但又破坏了类的封装性. 1.友元函数 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类 ,但需要在类的定义中加以声明,声明时

解决友元类(friend class)无法继承的问题

解决友元类(friend class)无法继承的问题   友元声明friend class是无法继承的.举例说明:class A声明class B为其友元类,也就是说class A授予class B访问class A的所有包括私有成员在内的所有成员.如果class C 继承class B.那么class C是不具备这种特权的.     但是如果我想在class C中访问class A的某个私有或者保护成员函数怎么办? 我们可以把工作交给父类.   #include <iostream> usi