实验4 静态成员与友元

合集下载

实验4 含有类的静态成员与类的友元的C++程序设计

实验4 含有类的静态成员与类的友元的C++程序设计

实验4 含有类的静态成员与类的友元的C++程序设计专业:计算机科学与技术班级:10计本1班学号:姓名:实验地点:B102实验时间:2011/11/1 指导教师:李佐勇一、实验目的1.理解类的静态成员解决共享问题的机制;2.掌握类的静态数据成员与静态函数成员的实现方法;3.理解利用友元关系实现数据共享的机制,掌握类的友元函数以及友元类的实现方法;4.学习多文件结构在C++程序中的使用。

二、实验环境一台PC机,Windows XP操作系统,Visual C++ 6.0开发环境。

三、实验内容1.设计一个解决王婆卖瓜问题的程序。

王婆卖瓜,每卖一个瓜,需记录该瓜的重量,还要记录所卖出的总重量和总个数,同时还允许退瓜。

设计一个具有静态数据、函数成员的watermelon类。

实现提示:西瓜类有3个数据成员:重量weight、总重量total_weight以及总个数total_number。

因为不论西瓜是否卖出,总重量total_weight和总个数total_number这两个数据总是要保留的,且这两个数据与单个的西瓜无关联,因此这两个数据要申明为静态数据成员。

成员函数:卖瓜用构造函数模拟,退瓜用析构函数模拟,瓜重用disp成员函数给出屏幕提示。

为了用不与特定对象相联系的静态成员函数来访问静态数据,还需要定义一个显示总重量和总个数的静态成员函数total_disp。

2.设计一个程序,其中有3个类,即CBank、BBank和GBank,分别为中国银行类、工商银行类和农业银行类。

每个类都包含一个私有数据balance,用于存放储户在该行的存款数,另有一个友元函数total用于计算储户在这3家银行中的总存款数。

3. 设计一个程序,其中有2个类,Point类为点类,包含2个私有数据x和y,表示点的坐标,line类为直线类,包含3个私有数据a、b和c,表示直线方程ax+by+c=0。

另有一个友元函数dist,用于计算一个点到直线的距离。

实验二-类与对象(二)

实验二-类与对象(二)

实验二-类与对象(二)实验三类与对象(2)【实验类型】验证性实验【实验课时】2学时【实验目的】(1)掌握对象数组定义与使用方法。

(2)理解对象指针的概念,学会用指针引用对象。

(3)了解this指针的工作方式。

(4)掌握静态数据成员和静态成员函数的基本使用方法。

(5)理解友元与友元函数的作用,掌握其使用方法。

【实验环境】硬件:计算机软件:Microsoft Visual C++ 6.0【实验内容】1、按要求阅读、修攺、调试和运行以下程序。

(1)实验内容① 定义一个类Stock,记录一支股票交易的基本信息,信息包括交易日序号(表示本月的第几个交易日,用整数表示)、当日最高价、当日最低价、当日开盘价和当日收盘价。

尽量发挥想象力,为该类设计成员函数。

② 在主函数中建立两个股票对象,分别存储该股票昨天和今天两天的信息,以当日收盘价计算该股票今天的涨幅。

③ 使用股票类Stock,定义一个对象数组存放连续5个交易日的股票信息。

编写一个主函数,计算两个Stock对象(前后两日)的当日收盘价计算当日涨幅。

用指针引用对象数组中的两个对象。

在主函数中调用该函数计算从第2个交易日开始每天的当日涨幅。

④ 在Stock类中定义一个静态数据成员,记录当前Stock对象的数量。

⑤ 设计一个成员函数Assign_stock为对象赋值,其中的形式参数是对另一个Stock对象的引用,使用this指针避免对自己的赋值,在主函数中显示用Assign_stock赋值的对象。

⑥ 定义一个友元函数计算Stock对象的当日开盘价是否高于当日收盘价。

若是,返回真,否则,返回假。

(2)实验程序及运行结果(参考)①以当日收盘价计算该股票今天的涨幅#include <iostream.h>class Stock{public:Stock(int n,double ma,double mi,double b,double e);void Set_Stock(int n,double ma,double mi,double b,double e);double Get_End();void Show_Stock();private:int Number;double Max,Min,Begin,End;};Stock::Stock(int n,double ma,double mi,double b,double e){ Number=n;Max=ma;Min=mi;Begin=b;End=e;}void Stock::Set_Stock(int n,double ma,double mi,double b,double e){ Number=n;Max=ma;Min=mi;Begin=b;End=e;}double Stock::Get_End(){ return End;}void Stock::Show_Stock(){ cout<<Number<<"\t";cout<<Max<<"\t";cout<<Min<<"\t";cout<<Begin<<"\t";cout<<End<<endl;}void main(){ Stocks1(1,4.18,4.00,4.05,4.09);Stocks2(2,4.41,4.03,4.04,4.40);cout<<"\n"<<(s2.Get_End()-s1.Get_E nd())/s1.Get_End()*100<<"%"<<endl;}②定义一个对象数组存放连续5个交易日的股票信息#include <iostream.h>const int N=2;class Stock{public:Stock(int n,double ma,double mi,double b,double e);Stock(); //增加无输入值的构造函数void Set_Stock(int n,double ma,double mi,double b,double e);void Set_Stock();double Get_End();void Show_Stock();private:int Number;double Max,Min,Begin,End;};Stock::Stock(int n,double ma,double mi,double b,double e){ Number=n;Max=ma;Min=mi;Begin=b;End=e;}Stock::Stock() //无输入值时,将其都清零{ Number=0;Max=0;Min=0;Begin=0;End=0;}void Stock::Set_Stock(int n,double ma,double mi,double b,double e){ Number=n;Max=ma;Min=mi;Begin=b;End=e;}double Stock::Get_End(){ return End;}void Stock::Show_Stock(){ cout<<Number<<"\t";cout<<Max<<"\t";cout<<Min<<"\t";cout<<Begin<<"\t";cout<<End<<endl;}void Stock::Set_Stock(){ cout<<"Number:";cin>>Number;cout<<"Max:";cin>>Max;cout<<"Min:";cin>>Min;cout<<"Begin:";cin>>Begin;cout<<"End:";cin>>End;}void main(){ int i;Stock s1[5],*p;for (i=0,p=s1;i<N;i++,p++)p->Set_Stock();for (i=0,p=s1;i<N;i++,p++)p->Show_Stock();for(i=1,p=s1+1;i<N;i++,p++) cout<<"\n"<<(p->Get_End()-(p-1)->Get_End())/(p-1)->Get_End()*100<<"%"<<en dl;}③定义一个静态数据成员,记录当前Stock 对象的数量#include <iostream.h>const int N=2;class Stock{public:Stock() {}Stock(int n,double ma,double mi,double b,double e);void Set_Stock(int n,double ma,double mi,double b,double e);void Set_Stock();double Get_End();void Show_Stock();int Get_N_count();private:static intN_count; //静态数据成员int Number;double Max,Min,Begin,End;};intStock::N_count=0; //此处定义时不需要加上staticStock::Stock() //无输入值时,将其都清零{N_count++;Number=0;Max=0;Min=0;Begin=0;End=0;}Stock::Stock(int n,double ma,double mi,double b,double e){ N_count++;Number=n;Max=ma;Min=mi;Begin=b;End=e;}void Stock::Set_Stock(int n,double ma,double mi,double b,double e){Number=n;Max=ma;Min=mi;Begin=b;End=e;}double Stock::Get_End() { return End;}void Stock::Show_Stock() { cout<<Number<<"\t";cout<<Max<<"\t";cout<<Min<<"\t";cout<<Begin<<"\t";cout<<End<<endl;} void Stock::Set_Stock() {cout<<"Number:";cin>>Number;cout<<"Max:";cin>>Max;cout<<"Min:";cin>>Min;cout<<"Begin:";cin>>Begin;cout<<"End:";cin>>End;}int Stock::Get_N_count(){ return N_count;}void main(){ int i;Stock s1[5];Stock *p;for (i=0,p=s1;i<N;i++,p++)p->Set_Stock();for (i=0,p=s1;i<N;i++,p++)p->Show_Stock();for(i=1,p=s1+1;i<N;i++,p++) cout<<"\n"<<(p->Get_End()-(p-1)->Get_E nd())/(p-1)->Get_End()*100<<" %";cout<<"\n"<<p->Get_N_count()<< endl;}④设计一个成员函数Assign_stock为对象赋值,其中的形式参数是对另一个Stock对象的引用#include <iostream.h>const int N=2;class Stock{public:Stock() {}Stock(int n,double ma,double mi,double b,double e);void Set_Stock(int n,double ma,double mi,double b,double e);void Set_Stock();void Assign_Stock(Stock& p);void Show_Stock();private:static int N_count;long Number;double Max,Min,Begin,End;};int Stock::N_count=0;Stock::Stock() //无输入值时,将其都清零{N_count++;Number=0;Max=0;Min=0;Begin=0;End=0;}Stock::Stock(int n,double ma,double mi,double b,double e){ N_count++;Number=n;Max=ma;Min=mi;Begin=b;End=e;}void Stock::Set_Stock(int n,double ma,double mi,double b,double e){ N_count++;Number=n;Max=ma;Min=mi;Begin=b;End=e;}void Stock::Assign_Stock(Stock& p){ if (this!=&p){Number=p. Number;Max=p.Max;Min=p.Min;Begin=p.Begin;End=p.End;}}void Stock::Show_Stock() { cout<<Number<<"\t";cout<<Max<<"\t";cout<<Min<<"\t";cout<<Begin<<"\t";cout<<End<<endl;} void Stock::Set_Stock() {cout<<"Number:";cin>>Number;cout<<"Max:";cin>>Max;cout<<"Min:";cin>>Min;cout<<"Begin:";cin>>Begin;cout<<"End:";cin>>End;}void main(){Stock s1(4,7.88,7.48,7.56,7.68);Stock s2;s2.Assign_Stock(s1);s2.Show_Stock();}⑤定义一个友元函数计算Stock对象的当日开盘价是否高于当日收盘价。

面向对象程序设计(C++)实验一--类和对象

面向对象程序设计(C++)实验一--类和对象

实验一类和对象一、实验目的:掌握类的设计和对象的创建及相关知识点如对象数组、类聚合、友元函数、静态成员。

二、实验内容:1、设计圆类,求两个圆的位置关系;2、设计圆类和直线类,求直线与圆的位置关系;3、设计学生类,求某班学生成绩的最高分、最低分及平均分;4、设计部门类和教师类,其中部门类成员为教师类的子对象;5、设计家庭银行账户类,其中账户资金为静态数据成员,为家庭成员共享;6、设计复数类,友元函数实现复数的加减。

三、实验过程:1、根据实验题目确定需要设计哪些类、各类中包含哪些数据成员和函数成员,设计各成员的访问权限,设计数据成员的数据类型,设计函数成员的函数原型;2、给出类设计的程序实现,特别要注意重载构造函数的实现;3、在主函数中完成题目中的逻辑,一般情况下需要创建相关类的对象,通过对象对成员函数的调用或者通过对象指针对成员函数的调用完成相应的功能。

四、参考程序代码:1、设计圆类,求两个圆的位置关系#include <iostream>#include <math.h>using namespace std;class Circle{private:float a,b,r;public:Circle(float c,float d,float e){a=c;b=d; r=e;}friend void position(Circle &,Circle &);};void position(Circle &c1,Circle &c2){float n,m,p;p=sqrt((c1.a-c2.a)*(c1.a-c2.a)+(c1.b-c2.b)*(c1.b-c2.b)); n=fabs(c1.r-c2.r);m=c1.r+c2.r;if(p>m)cout << "相离";if(p==m)cout << "相切";if(p<m)cout << "相交";}int main(){float a,b,c,d,e,f;cin >> a >> b >> c >> d >> e >> f ;Circle c1(a,b,c),c2(d,e,f);position(c1,c2);return 0;}运行结果:2、设计圆类和直线类,求直线与圆的位置关系#include<iostream>#include<math.h>using namespace std;class Circle//圆类{private:float x,y,r;public:Circle(float a,float b,float c) {x=a;y=b;r=c;}float getx(){return x;}float gety(){return y;}float getr(){return r;}};class Line//直线类{private:float a,b,c;public:Line(float x,float y,float z){a=x;b=y;c=z;}void position(Circle c1){float d=fabs(a*c1.getx()+b*c1.gety()+c)/sqrt(a*a+b*b) ;//圆心到直线的距离if(d<c1.getr())cout << "相交";if((d-c1.getr())<0.000001)cout << "相切";cout << "相离";}};int main(){Line l1(3,3,4);//创建直线对象Circle c1(-23,3,7);//创建圆对象l1.position(c1);return 0;}运行结果:3、设计学生类,求某班学生成绩的最高分、最低分及平均分#include <iostream>#include <string.h>using namespace std;class Student{private:char name[20],xuehao[20];float math;public:Student(){}Student(char *na,char *xu,float ma):math(ma) {strcpy(name,na);strcpy(xuehao,xu);}void set(char *na,char *xu,float ma){math=ma;strcpy(name,na);strcpy(xuehao,xu);}char *get_name(){return name;}char *get_xuehao(){return xuehao;float get_math(){return math;}};void max_min(Student stu[],int n){Student max,min;max=min=stu[0];for(int i;i<n;i++){if(stu[i].get_math()>max.get_math())max=stu[i];if(stu[i].get_math()<min.get_math())min=stu[i];}cout << "学生成绩最高:" << max.get_name() << "," << max.get_xuehao() << "," << max.get_math() << endl;cout << "学生成绩最低:" << min.get_name() << "," << min.get_xuehao() << "," << min.get_math() << endl;}void ave(Student stu[],int n){float sum=0;for(int i=0;i<n;i++){sum=sum+stu[i].get_math();cout << "ave=" << sum/n;}int main(){char na[20],xu[20];float ma;Student stu[20];int n;cout << "请输入学生总人数"; cin >> n;for(int i=0;i<n;i++){cin >> na >> xu >> ma ; stu[i].set(na,xu,ma); }max_min(stu,n);ave(stu,n);return 0;}运行结果:4、设计部门类和教师类,其中部门类成员为教师类的子对象#include <iostream>#include <string.h>using namespace std;class Department{private:int dep_num;char dep_master[20];char dep_name[20];public:Department(){}Department(int num,char *ma,char *na){dep_num=num;strcpy(dep_master,ma);strcpy(dep_name,na);}void show(){cout << dep_num << "," << dep_master << "," << dep_name ; }};class Teacher{private:char name[20];char haoma[20];Department dep;public:Teacher(char *n,char *nu,int num,char *ma,char *na):dep(num,ma,na) {strcpy(name,n);strcpy(haoma,nu);}void show(){dep.show();cout << "," << name << "," << haoma << endl;}};int main(){Teacher hp("wanghai","12345",6,"kiki","computer");hp.show();return 0;}运行结果:5、设计家庭银行账户类,其中账户为静态数据成员,为家庭成员共享#include <iostream>#include <string.h>using namespace std;class Familymember//家庭成员类{private:char membername[10];//成员名public:static float account;//共享账户资金 Familymember(char *name);static void save(float money);//存钱 static void pay(float money);//支出 static void show(); //显示账户余额};float Familymember::account=0;Familymember::Familymember(char *name) {strcpy(membername,name);}void Familymember:: save(float money) {account= account+money;}void Familymember:: pay(float money){account= account-money;}void Familymember:: show(){cout<<account<<endl;}int main()//主函数{ Familymember husband("wang"),wife("Li"); husband.save(10000);wife.pay(3000);wife.save(5000);wife.show();husband. show();}运行结果:6、设计复数类,友元函数实现复数的加减#include <iostream>using namespace std;class Fushu{private:float ss,xs;public:Fushu(){}Fushu(float a,float b){ss=a;xs=b;}friend Fushu jiafa(Fushu &f1,Fushu &f2){return Fushu((f1.ss+f2.ss),(f1.xs+f2.xs)); }friend Fushu jian(Fushu &f1,Fushu &f2){return Fushu((f1.ss-f2.ss),(f1.xs-f2.xs)); }void show(){cout << ss << " + " << xs << "i" << endl; }};int main(){Fushu f1(2,3),f2(4,5);Fushu f3,f4;f3=jiafa(f1,f2);f4=jian(f1,f2);f3.show();f4.show();return 0;}运行结果:。

11427-C++面向对象程序设计-实验指导书

11427-C++面向对象程序设计-实验指导书

11427-C++面向对象程序设计-实验指导书实验1 环境熟悉和类与对象1.实验目的(1)熟悉上机环境,了解编译过程中常见的错误与解决办法。

(2)学会编写简单的C++程序并会用debug调试程序。

(3)观察构造函数和析构函数的执行过程。

(4)掌握动态内存分配的两个运算符的使用(5)掌握函数参数的三种传递方式。

(6)学习利用友元求解问题。

2.实验内容(1)定义一个学生类,学生信息有学号、姓名和成绩。

成绩包括计算机、英语、数学成绩和平均分。

要求利用队列实现学生的入队、出队和显示等功能。

算法思路:定义一个类Student,数据成员有:学生信息,进行入队、出队和显示操作的front(队头)、rear(队尾)和num(统计队列中元素的个数),其中学生信息定义成结构体类型的数组;成员函数有学生的入队操作、出队操作和显示操作,通过构造函数对学生信息进行初始化。

(2)定义一个图书类,图书信息有图书名称、作者、出版社、价格。

要求利用栈实现图书的入库、出库和显示等功能。

算法思路:定义一个类Stack,数据成员有:图书信息,进行入库、出库和显示操作的top(栈顶指针),其中图书信息定义成结构体类型的数组;成员函数有图书的入库、出库和显示操作,通过构造函数对图书信息进行初始化。

(3)有Distance类和Point类,将Distance类定义为Point类的友元类来实现计算两点之间距离。

实验2 函数重载与内联函数1.实验目的(1)掌握函数重载的应用。

(2)理解内联函数的作用,掌握内联函数的应用。

2.实验内容(1)利用重载求两个整数、三个整数和四个整数的最小值。

(2)利用重载计算长方形、正方形、圆、梯形的面积。

(3)利用重载编写求整数绝对值和求实数绝对值。

(4)利用重载实现对10个整数和10个实数的排序。

(5)判断一个字符是否为数字字符,要求用内联函数实现。

实验3 常量与引用1.实验目的(1)理解常量的含义与#define的区别。

静态成员函数

静态成员函数

静态成员函数静态成员函数是指在类中声明的用static关键字修饰的函数,也叫作类函数。

一般来说,它不需要访问类的数据成员,它只可以调用类的静态成员函数和友元函数,不可以调用普通成员函数,但它可以调用其他所有的成员函数。

静态成员函数也可以用于构造函数那里,因为只有静态成员函数没有隐式的this指针,所以,静态成员函数无法访问非静态成员数据。

二、静态成员函数的作用1、它可以实现自定义的初始化及赋值,所有的对象在创建时都使用相同的初始化及赋值,这样可以节省很多时间。

2、用它可以实现全局函数的功能,但与全局函数不同的是,它可以访问类的private部分。

3、它可以提供对象的总数,通过静态友元函数来实现,可以检测构造函数和析构函数的调用次数,从而检测对象的数量。

4、它可以返回类的静态成员变量,也可以用于类的计算,这种方法可以使我们不必使用全局变量。

三、静态成员函数的特点1、只有在类中才能使用静态成员函数,而不能直接在主程序中使用它们。

2、它可以调用类中所有的静态成员函数,但不能调用普通成员函数。

3、它不能操作类的非静态成员数据,但可以调用其他所有的成员函数。

4、它只能被类的静态成员函数和友元函数调用。

四、实例下面我们来看一个使用静态成员函数的实例,这个实例演示了如何使用静态成员函数来访问类的静态成员变量。

#include <iostream>using namespace std;class StaticClass{private:static int count;public://静态成员函数static int getCount(){return count;}//普通成员函数void setCount(int val){count = val;}};//静态变量初始化int StaticClass::count = 0;int main(){//设置count的值StaticClass::setCount(5);//获取count的值cout<<count的值为:<<StaticClass::getCount()<<endl;return 0;}上面的程序中,定义了一个静态变量count,在类外面定义了这个静态变量,指定了它的初值为0,在类中定义了一个静态成员函数getCount(),用于访问静态变量count,这里不用构造函数,也没有实例化任何对象,只要使用类名来调用静态成员函数就可以使用私有成员count,并且可以通过它获取静态变量count的值,并将这个值输出在屏幕上。

C++类中的各种成员,嵌套类,友元,this指针专题

C++类中的各种成员,嵌套类,友元,this指针专题

类中的各种成员
const ,static,[],*p,const static,对象成员,常量对象,mutable 1.类中的静态成员变量 static:被类中的所有对象所共享,静态成员属于整个类不属于某个对象。静态成员变量和全局 变量差不多,只是他的作用范围为定义他的类及类的对象所知。 1.1.当在一个类中声明静态成员变量时并没有定义该变量即没有为他分配存储空间,所以必须在类外对静态成员变 量提供全局定义,注意必须在类外,这样就可以为变量分配内存,定义的方式为使用作用域解析符,比如有类 hyong 类中有静态整型成员 a,那么在类外定义该变量的方式为 int hyong::a=9;注意必须要有在类中声明的类型, 如果定义时没有初始化则自动初始化为 0。 1.2.静态成员变量如果是类中的公有成员则可以在程序中使用语句 hyong::a 来访问该变量,当然也可以通过对象名 来访问该变量,如果变量是私有或者保护的,则只能用静态的成员函数来访问该变量。 1.3 不能用初始化列表来初始化静态成员变量。 2.静态成员函数 static,静态成员函数没有 this 指针,静态成员函数只能引用这个类的其他类静态成员,当然全局函数 和数据可以访问,因为类的函数都要用 this 指针来访问成员,因为静态成员函数没有 this 指针,所以不能访问除静态 成员之外的成员。同一个函数不可以有静态和非静态两种版本,静态成员函数不可以是虚函数,静态成员函数不能是 const 和 volatile。静态成员函数使用是有限的,通常使用静态成员函数来访问类中的私有静态成员变量。在类外定义 的形式为 int hyong::g(){}注意,这里没有 static 说明符。 3.const 成员变量参看第四节初始化列表。 4.const 成员函数,形式为 int f() const{}注意 const 在括号后,如果把 const 放在 int 前就成为一个反回 const int 类型的函 数了, 把函数声明为 const 后就使得 this 可以当做一个 const 指针, 从而使得函数不能修改调用它的对象也就是说不能 改变任何一个类的成员变量的值。如果想让 const 函数能修改某一部分成员,可以把该成员声明为 mutable 类型,例 如 mutable int a。在类外定义的形式为 int hyong::f() const{} 5.const static 常量静态数据成员,这种类型的成员变量可以直接在类的定义中直接初始化,这也是唯一一种可以在类 中初始化的类型,如果没有在类中初始化,在类外的初始化方式为 const int hyong::a=2;注意 const 和类型都必须有。 6.const 常量对象:即把对象声明为常量,即 const hyong m,常量对象不能调用可能改变对象的值的函数,因此常量对 象只能调用类中的 const 常量函数,因为不是 const 的函数都有可能改变对象的值。 6.2.常量对象可以调用类中的公有成员,如 m.a 就是正确的如果 a 是公有的。 6.4.不能对常量对象的公有成员重新赋值,如 m.a=3 就是错误的。但可以对类中的公有静态成员变量重新赋值,因 为静态成员变是不属于这个常量对象,他是属于整个类的。 7.对象数组:对象数组即数组中的每个成员都是一个对象,例如 hyong a[3];其中 a[0],a[1],a[2]都是一个 hyong 类型的 对象。对象数组的初始化,如果有默认构造函数则语句 hyong a[3]将调用默认构造函数初始化 3 个对象,如果对象数

实验二_类的静态数据成员和友元

实验二_类的静态数据成员和友元

h(&x);
cout<<"i="<<x.display()<<endl;
return 0;
}
(2)运行结果截图
(3)对程序的分析及注意事项 分析:首先建立一个X类的对象x并且初始化i=1,输出I;然后建立一个Y类对象y,然 后调用y的成员函数g(X*x),使得i=i+1,输出i;然后建立一个Z对象z,调用z的成员函 数f(X*x),是的i=i+5,输出i;最后调用ቤተ መጻሕፍቲ ባይዱ(X*x),使得i=i+10,输出i; 注意事项:在my_x_y_z.h头文件中,cout,endl不可用。 2.3 Boat and Car (1)源代码
《面向对象程序设计》 上机实验报告

实验二 类的静态数据成员和友元




1) 掌握友元函数和友元类设计的方法。
2) 学习静态成员的使用,理解静态成员的特殊用途。 验
3) 掌握友元类的定义。 目
4) 学习友元函数及友元类,理解友元类的作用。

5) 掌握友元函数和友元类设计的方法。
1)定义一个 Cat 类,拥有静态数据成员 HowManyCats,记录 Cat 的 实


~cat(){HowManyCats--;}

static void GetHowMany()


{cout<<"Object HowManyCats:"<<HowManyCats<<endl;}

个 private:


static int HowManyCats;

作业3答案

作业3答案

(静态成员、this指针、友元):1.下面对静态数据成员的描述中,正确的是()。

C.静态数据成员不能受private控制符的作用D.公有静态数据成员可以直接用类名调用答案:D2.已知类X是类Y的友元,类Y是类Z的友元,则。

C. 类Z的成员函数可以访问类Y的对象的任何成员友元类不具有传递性D. 类X的成员函数可以访问类Y的对象的任何成员答案:D5.友元在访问类的对象的成员时()。

A.直接使用类的成员名B.使用this指针指向成员名C.使用“类名::成员名”的形式D.使用“对象名.成员名”的形式答案:D3-39 以下程序有什么错误?如有请予以修改。

(1)使用静态成员函数。

#include <iostream.h>#include <string.h>class Person{public:char m_strName[20];long m_ID;public:Person(char* strName,long ID) {strcpy(m_strName, strName); m_ID=ID;}static long GetID() {return m_ID;}};void main(){ Person person1("LiuJun",1101640524);cout<<"ID="<<Person::GetID()<<'\n';}错误:见红色标记分析(知识点:静态成员函数只能访问类的静态成员(成员变量和成员函数),而不能访问类的非静态成员):静态成员函数GetID()不能访问非静态成员m_ID。

解决方法:将对象作为静态成员函数的参数,然后在静态成员函数中通过对象访问它的非静态成员;如下蓝色部分:改为:#include <iostream.h>#include <string.h>class Person{public:char m_strName[20];long m_ID;public:Person(char* strName,long ID) {strcpy(m_strName, strName); m_ID=ID;} static long GetID(Person p1) {return p1.m_ID;}};void main(){Person person1("LiuJun",1101640524);cout<<"ID="<<Person::GetID(person1)<<'\n';}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.2 实验与实践任务
3.2.1 实验名称静态成员和友元
3.2.2 实验目的
1.掌握静态成员的定义和使用。

2.掌握友元的定义和使用。

3.2.3 实验要求
1.调试程序要记录调试过程中出现的问题及解决办法;
2.编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;
3.在编写程序时,要按照多文件结构来组织程序。

4.做完实验后给出本实验的实验报告,实验报告的内容包括实验目的、实验内容和结果分析。

3.2.4 实验内容
【P1】商店销售某一商品,商店每天公布统一的折扣(discount)。

同时允许销售人员在销售是灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。

现在已知当天3名销售员的销售情况为:
销售员货号(num)销货件数(quantity)销货单价(price)
101 5 23.5
102 12 24.56
103 100 21.5
请编程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价。

要求用静态数据成员和静态成员函数
【P2】创建一个SavingsAccount类:用static(静态)数据成员包含每个存款人的annualInterestRate(年利率)。

类的每个成员包含一个private数据成员savingsBalance,表示当前存款额。

提供一个calculateMonthlyInterest 成员函数,计算月利息,用savingsBalance乘以annualInterestRate除以12取得,并将当月月息加入savingsBalance。

提供一个静态成员函数modifyInterestRate,将静态annualInterestRate设置为新值。

实例化两个不同的SavingsAccount对象saver1和saver2,余额分别为$2 000.00和$3 000.00 将annualInterestRate设置为3%,计算每个存款人的月息并打印出新的结果。

【P3】学校的人事部门保存了有关学生的部分数据(学号、姓名、年龄、住址),教务部门也保存了学生的另外一些数据(学号、姓名、性别、成绩),两个部门分别编写了本部门的学生数据管理程序,其中都用了Student作为类名。

现在要求在全校的学生数据管理程序中调用这两个部门的学生数据,分别输出两种内容的学生数据。

要求用标准C++编程,使用命名空间。

【P4】设计一个日期类Date,包含日期的年、月、日三个私有数据成员,编写一个友元函数,求两个日期之间相差的天数。

【P5】每一个学生有学号、姓名、一门课的成绩等基本信息。

编写一个程序,用友元
函数实现比较学生成绩的高低,并输出所有学生中最高分和最低分的姓名。

【P6】从前有一个农夫抓到一条大蛇,一个渔夫抓到一条大鱼,蛇、鱼的长度和重量分别由键盘输入,试比较(利用友元函数处理)这两类不同动物的长度、重量是否相等。

【P7】设线段AB的端点为A(x1,y1)和B(x2,y2),线段CD的端点为C(x3,y3)和(x4,y4),则有:
r1=y3(x4-x3)-y1(x4-x3)+(x1-x3)(y4-y3)
r2=(y2-y1)(x4-x3)-(x2-x1)(y4-y3)
r=r1/r2;
t=(x1-x3+r(x2-x1))/(x4-x3)
根据r和t的值,有以下几种情况:
(1)0<r<1,0<t<1,则线段AB和线段CD相交。

(2)0<r<2,t>=1,则线段AB和线段CD不相交,且线段CD在线段AB的一侧。

(3)r>=1或r<=0,0<t<1,则线段AB和线段CD不相交,且线段AB在线段CD的一侧。

(4)r>=1或r<=0,t>=1或t<=0,则线段AB和线段CD不相交。

编写一个程序,采用友元函数判断两条线段相交的情况。

相关文档
最新文档