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;
}