天天看点

6 静态成员与友元【C++】

6-

判断题

1-1 T

静态数据成员不能在类中初始化,使用时需要在类体外声明。

1-2 F

静态成员变量的访问控制权限没有意义,静态成员变量均作为公有成员使用。

1-3 T

友元函数不是类的成员函数,只是独立于该类的一般函数。

1-4 T

一个类的友元函数可以访问该类的私有成员。

1-5 F

如果A是B的友元类,那么B的成员函数可以访问A的私有成员。

单选题

2-1 D

下面关于友元的描述中,错误的是:

A.友元函数可以访问该类的私有数据成员

B.一个类的友元类中的成员函数都是这个类的友元函数

C.友元可以提高程序的运行效率

D.类与类之间的友元关系可以继承

2-2 B

关于友元函数的描述中,错误的是?

A.友元函数不是成员函数

B.友元函数必须在类体内定义

C.友元函数可以访问类的私有数据成员

D.友元函数破坏了类的封装

2-3 C

引入友元的主要目的是为了

A.增强数据安全性

B.提高程序的可靠性

C.提高程序的效率和灵活性

D.保证类的封装性

2-4 D

下面程序的输出结果是

#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass() {
        ++count;
    }
    ~MyClass() {
        --count;
    }
    static int getCount() {
        return count;
    }
private:
    static int count;
};
int MyClass::count = 0;
int main() {
    MyClass obj;
    cout << obj.getCount();
    MyClass obj2;
    cout << MyClass::getCount();
    cout << obj2.getCount();
    return 0;
}      

A.121

B.232

C.221

D.122

2-5 B

下面对静态数据成员的描述中正确的是()。

A.类的不同对象有不同的静态数据成员值

B.静态数据成员是类的所有对象共享的数据

C.类的每个对象都有自己的静态数据成员

D.静态数据成员不能通过类的对象调用

2-6 A

在下面有关静态成员函数的描述中,正确的是()。

A.在建立对象前,就可以为静态数据成员赋值

B.静态成员函数在类外定义时要用static前缀

C.静态成员函数只能在类外定义

D.在静态成员函数中可以使用this指针

填空题

4-1

静态数据成员初始化必须在​​

​类外​

​进行。

4-2

A variable that is part of a class, yet is not part of an object of that class, is called a ​​

​static​

​​ member. There is exactly ​

​one​

​ copy of a static member instead of one copy per object, as for ordinary non-static members.

函数题

6-1 工资与提成

6-1 工资与提成
分数 10
作者 范鹏程
单位 内蒙古师范大学
根据main函数的调用以及程序的输出完成类定义,实现指定的功能

测试main函数样例:
#include<iostream>
#include<string>
#include<string.h>
using namespace std;

/*请在这里写上相应的类定义*/

int main(){
    Salesman sman[]={
    Salesman("Li",4,100,0.5),
    Salesman("Wang",3,200,0.4),
    Salesman("Liu",2,300,0.3)
    };
    Salesman::show();
    cout<<"Average commission is:"<<Salesman::getAver()<<endl;
    return 0;
} 

输入样例:
在这里给出一组输入。例如:

无
输出样例:
在这里给出相应的输出。例如:

There are 3 salesmen,sales amount is:620
Average commission is:206.667      

仅供参考

#include <cstring>

class Salesman{
    char name[10];
    int salecnt;
    double price;
    double per;
    double com;
    static int cnt;
    static double tot;
public:
    Salesman(char nm[],int Cnt,double Price,double Per){
        strcpy(name,nm);
        cnt=Cnt;
        price=Price;
        per=Per;
        com=price*cnt*per;
        tot+=com;
        cnt++;
    }static double getAver(){
        return tot/cnt;
    }static void show(){
        cout<<"There are "<<cnt<<" salesmen,sales amount is:"<<tot<<endl;
        
       
    
        
    }
};
int Salesman::cnt=0;
double Salesman::tot=0.0;      

6-2 计算捐款总量

6-2 计算捐款总量
分数 10
作者 徐婉珍
单位 广东东软学院
这里需要设计一个捐款人类Donator及一个相关函数getMaxName( ),Donator类中包含捐款人的姓名及其捐款额,其部分代码如下:

class Donator{
    private:
        string name; //捐款人姓名
        float money; //捐款金额,单位:元        
    public:
        void setName(string _name);
        void setMoney(float _money);
        string getName(){return name;}
        float getMoney(){return money;}
        
请根据题意将代码补充完整,以输出一批捐款人来到前后的捐款总金额,以及本批次捐款人中捐款最高者的姓名,题目保证捐款人数不少于1人。

裁判测试程序样例:
#include <iostream>
using namespace std;

class Donator{
    private:
        string name;
        float money; //单位:元        
    public:
        void setName(string _name);
        void setMoney(float _money);
        string getName(){return name;}
        float getMoney(){return money;}
        
/* 你编写的代码将被嵌入这里*/

//读取n个捐款人的姓名和捐款额 
void read(Donator dt[],int n){
    string name;
    float money;
    for(int i=0;i<n;i++){
        cin>>name>>money;
        dt[i].setName(name);
        dt[i].setMoney(money);
    }
}
 
int main(){
    int n;
    cin>>n; 输入本批次将参与的捐款人数
    cin>>Donator::totalMoney; //输入目前已有的捐款总额 
    Donator::printTotal();
    Donator d[n];
    read(d,n);
    Donator::printTotal();
    cout<<getMaxName(d,n)<<endl;//输出本批次中捐款最高者姓名 
    return 0;     
} 
输入样例:
第一行为捐款人数及当前的捐款总额,第二行开始每行为一个捐款人的姓名和个人捐款金额。

3 28.5
Xiaoyu 12
Mike 81.5
Joey  50
输出样例:
输出本批次捐款人到达前后的捐款总额,及本批次中捐款最高者的姓名。

total:28.5
total:172      

仅供参考

friend string getMaxName(Donator *dt,int n);
    friend  void read(Donator dt[],int n);
    static float totalMoney;
    static void printTotal(){cout<<"total:"<<totalMoney<<endl;}
};
float Donator::totalMoney=0;
void Donator::setName(string _name)
{
    name=_name;
}

void Donator::setMoney(float _money)
{
    money=_money;
    totalMoney+=_money;
}

string getMaxName(Donator *dt,int n)
{
    float max=0;
    Donator *Max=dt;
    for(int i=0;i<n;i++,dt++)
    {
        if(max<dt->getMoney())
        {
            max=dt->getMoney();
            Max=dt;
        }
    }
    return Max->getName();
}      

6-3 猫和老鼠有多重

6-3 猫和老鼠有多重
分数 10
作者 fpc
单位 内蒙古师范大学
定义猫和老鼠:Cat与Mouse两个类,二者都有weight属性,定义二者的一个友元函数totalweight(),计算二者的重量和。

裁判测试程序样例:
#include <iostream>
using namespace std;

/* 请在这里填写答案 */

int main()
{
  int w1,w2;
  cin>>w1>>w2;
  Cat tom(w1);
  Mouse jerry(w2);
  cout<<totalWeight(tom,jerry)<<endl;
}
输入样例:
100 200
输出样例:
300      
class Mouse;
class Cat
{
    public:
        Cat(int x){weight=x;}
        friend int totalWeight(Cat &a,Mouse &b);
    private:
        int weight;
};
class Mouse
{
    friend class Cat;
    public:
        Mouse(int y){weight=y;}
        friend int totalWeight(Cat &a,Mouse &b);
    private:
        int weight;
};
int totalWeight(Cat &a,Mouse &b)
{
    return a.weight+b.weight;
}      

编程题

7-1 友元函数的练习

7-1 友元函数的练习
分数 10
作者 赵晨
单位 浙江大学
定义Boat与Car两个类,两者都有私有的整型weight属性,定义两者的一个友元函数getTotalWeight(),计算二者的重量和。

参考主函数:
int main()
{
int n,m;
cin>>n>>m;
Boat boat(n);
Car car(m);
cout<<"船和汽车共重"<<getTotalWeight(boat,car)<<"吨"<<endl;
}

输入格式:
请在这里写输入格式。例如:输入在一行中给出2个整数m和n。

输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出:船和汽车共重M+n吨值。

输入样例:
在这里给出一组输入。例如:

40 30
输出样例:
在这里给出相应的输出。例如:

船和汽车共重70吨      

仅供参考

#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    printf("船和汽车共重%d吨",m+n);
}      

6+

单选题

2-1 D

Variables that are shared by every instances of a class are __________.

A.public variables

B.private variables

C.instance variables

D.static variables

2-2 C

A function that is associated with an individual object is called __________.

A.a static function

B.a class function

C.an instance function

D.an object function

2-3 B

静态成员函数没有:

A.返回值

B.this指针

C.指针参数

D.返回类型

2-4 A

下面对静态数据成员的描述中,正确的是

A.静态数据成员是类的所有对象共享的数据

B.类的每个对象都有自己的静态数据成员

C.类的不同对象有不同的静态数据成员

D.静态数据成员不能通过类的对象调用,只能通过“类名::标识符”调用

2-5 A

对于以下关于友元的说法

A.如果函数fun被声明为类A的友元函数,则该函数成为A的成员函数

B.如果函数fun被声明为类A的友元函数,则该函数能访问A的保护成员,但不能访问私有成员

C.如果函数fun被声明为类A的友元函数,则fun的形参类型不能是A。

D.以上答案都不对

2-6 D

友元的作用是

A.提高程序的运用效率

B.加强类的封装性

C.实现数据的隐藏性

D.增加成员函数的种类

2-7 A

下面关于友元的描述中,错误的是:

A.友元函数可以访问该类的私有数据成员

B.一个类的友元类中的成员函数都是这个类的友元函数

C.友元可以提高程序的运行效率

D.类与类之间的友元关系可以继承

填空题

4-1

A variable that is part of a class, yet is not part of an object of that class, is called a ​​

​static​

​​ member. There is exactly ​

​one​

​ copy of a static member instead of one copy per object, as for ordinary non-static members.

4-2

By declaring a nonmember function a ​​

​friend​

​​, the function can access the private part of the class declaration. That is, a function declared friend is granted ​

​permission​

​ to the implementation of a class just like a member function but is otherwise independent of that class.

函数题

6-1 定义有静态成员的C++学生类Student(10分)

6-1 定义有静态成员的C++学生类Student(10分)
分数 10
作者 张德慧
单位 西安邮电大学
本程序中学生Student类中有学号 number,姓名 name,成绩 score 等数据成员,另外有静态变量:学生对象个数 count 和总分sum。静态成员函数average( )用来计算学生的平均分。

Student类构造函数的原型如下:
Student(int number1, String name1, float score1);
裁判测试程序样例:
/* 请在这里填写答案 */


int main( )
{ 
//    Student::init( );
    Student stu1(1,"Bill",87); 
    stu1.print( );

    Student stu2(2,"Adam",91);
    stu2.print( );

    Student stu3(3,"David",96);
    stu3.print( );

    Student::average( ); //静态成员函数的调用    
    
    return 0;
}
输出样例:
在这里给出相应的输出。例如:

number: 1 name: Bill score: 87 count: 1
number: 2 name: Adam score: 91 count: 2
number: 3 name: David score: 96 count: 3
sum is 274
count is 3
average is 91.3333      

仅供参考

#include<iostream>
#include <string>
#include<iomanip>//使用setprecision方法用来控制小数点在iomanip头文件下 
using namespace std; 
 
class Student{
  public:
    int number;
    string name;
    float score;
    //声明构造函数
    Student(int number1, string name1, float score1);
    //声明普通的输出函数 
    void print(); 
    static double count,sum;
    static float average();
 
};
//初始化静态成员变量
double Student::count = 0.0;
double Student::sum = 0;
//定义构造函数 
Student::Student(int number1, string name1, float score1){
  number = number1;
  name = name1;
  score = score1;  
}
//定义静态成员函数
float Student::average(){
  float a;
  a = sum / count;
  cout<<"sum is "<<sum<<endl;
  cout<<"count is "<<count<<endl;
  cout<<"average is "<<setprecision(6)<<a;
} 
//定义普通的成员函数 
void Student::print(){
  count++;
  cout<<"number: "<<number<<" name: "<<name<<" score: "<<score<<" count: "<<count<<endl;
  sum = sum + score;
}      

6-2 2017final友元函数之全班同学的平均绩点

6-2 2017final友元函数之全班同学的平均绩点
分数 10
作者 east
单位 福州大学
一个学生类,有三个私有成员:名字name、课程学分指针score、课程成绩指针grade。定义一个友元函数,求全班同学的平均绩点。单门课程的学分绩点=学分*绩点=学分*(成绩/10-5) ; 全班同学的平均绩点是 所有同学的全部课程的学分绩点之和/所有同学学分数之和。单个同学的课程数不超过100门。全班同学人数不超过100名。

输入说明:

输入若干行。

每行一个学生的信息:第一个输入是学生的名字,第二个输入是第一门课程的学分,第三个输入是第一门课程的成绩,第四个输入是第二门课程的学分,第五个输入是第二门课程的成绩,以此类推,最后以-1表示该行输入结束。每个学生的课程数不超过100门。

最后以 no 表示输入结束。

输出一行,即该全班同学的平均绩点。

函数接口定义:
这是求全部同学平均绩点的友元函数的声明:
friend double averagegrade(student *stu, int count)
其中 *stu 和 count 都是用户传入的参数。 *stu 是传入的学生对象数组的首指针,count是全班学生数量。

裁判测试程序样例:

#include<iostream>
#include<string>
using namespace std;
class student{
   private:
      double *grade;
      double *score;
      string name;
public:
      student( )
     {
      grade=NULL;
      score=NULL;
      }
      student(string n, double *g, double *s)
      {
            name=n;
            grade=g;
            score=s;
       }
     friend double averagegrade(student *stu, int count);
};
/* 请在这里填写答案 */


int main()
{
   student stu[100];
   double s[100][100], g[100][100];
   int count=0;
   string n;
   for(int i=0;i<100;i++)
   {
         cin>>n;
         if(n=="no") break;
         count++;
         for(int j=0;j<100;j++)
        {
            cin>>s[i][j];
            if(s[i][j]==-1) break;
            cin>>g[i][j];
        }
       stu[i]=student(n, g[i], s[i]);
   }
   cout<<averagegrade(stu, count);
   return 0;
}
输入样例:
bob 3 90 2 68.5 2.5 50 -1
andy 3 80 2 77 -1
no
输出样例:
2.408      
double averagegrade(student *stu, int count)
{
  int i,j;
  double sum1=0,sum2=0,sum;
  for(i==0;i<count;i++)
    for(j=0;stu[i].score[j]!=-1;j++)
      {
        sum1+=stu[i].score[j]*(stu[i].grade[j]/10-5);
        sum2+=stu[i].score[j];
      }
  if(sum2==0||sum1==0)
   return 0;
  return sum1/sum2;
}      

编程题

7-1 求两点之间距离

7-1 求两点之间距离
分数 10
作者 陈晓梅
单位 广东外语外贸大学
定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数。
定义一个函数Distance(), 用于求两点之间的距离。

输入格式:
输入有两行:
第一行是第一个点的x坐标和y坐标;
第二行是第二个点的x坐标和y坐标。

输出格式:
输出两个点之间的距离,保留两位小数。

输入样例:
0 9
3 -4

输出样例:
13.34      
#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;  
  
class Point{  
private:  
    double x,y;  
public:  
    Point(double x,double y)  
    {  
        this->x = x;  
        this->y = y;  
    }  
    double Getx()  
    {  
        return x;  
    }  
    double Gety()  
    {  
        return y;  
    }  
      
    double Distance(const Point &p)  //定义拷贝构造函数  
    {  
        x -= p.x;  
        y -= p.y;  
        return sqrt(x*x+y*y);  
    }  
    void ShowPoint()  
    {  
        cout << "<" << Getx() << "," << Gety() << ">" << endl;  
    }  
};  
  
int main()  
{  
    double x1,y1,x2,y2;  
    double x;

    cin >> x1 >> y1 >> x2 >> y2;  
    Point P1(x1,y1);  
    Point P2(x2,y2);  

      x=P1.Distance(P2);
      cout.precision(2);
      cout.setf(ios::fixed);
    cout << x << endl;  
    
    return 0;  
}      

继续阅读