复习C++类和对象的知识做的,其中第三题考查了类型转换构造函数,第四题考查的析构函数,都非常简单。
让我感到棘手的是第一题中如何读入一个带有空格的字符串,最后解决方案是发现了cin.getline()函数。其次是要使用一个char c来存储用于分隔的逗号。eg:输入是mao mao,18,8092,80,80,80,80 你使用cin.getline(name,20,’,’);cin>>age>>id;是错的,因为age和id之间有逗号,我们应该用cin>>age>>c>>id;
第二题的难点:在于理解复制构造函数的调用次数。
实现一个学生信息处理程序,计算一个学生的四年平均成绩。
要求实现一个代表学生的类,并且类中所有成员变量都是【私有的】。
补充下列程序中的 Student 类以实现上述功能。
#include
#include
#include
#include
#include
#include
using namespace std;
class Student {
};
int main() {
Student student; // 定义类的对象
student.input(); // 输入数据
student.calculate(); // 计算平均成绩
student.output(); // 输出数据
}
输入数据为一行,包括:
姓名,年龄,学号,第一学年平均成绩,第二学年平均成绩,第三学年平均成绩,第四学年平均成绩。
其中姓名为由字母和空格组成的字符串(输入保证姓名不超过20个字符,并且空格不会出现在字符串两端),年龄、学号和学年平均成绩均为非负整数。信息之间用逗号隔开。
输出一行数据,包括:
姓名,年龄,学号,四年平均成绩。
信息之间用逗号隔开。
样例输入
Tom Hanks,18,7817,80,80,90,70
样例输出
Tom Hanks,18,7817,80
提示
必须用类实现,其中所有成员变量都是私有的。
输出结果中,四年平均成绩不一定为整数。
其中cin.getline此函数会一次读取多个字符(包括空白字符)。它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字符,直到读满N-1个,或者遇到指定的结束符为止。若不指定结束符,则默认结束符为’\n’。其语法为:
cin.getline(字符指针(char*),字符个数N(int),结束符(char));
#include
#include
#include
#include
#include
#include
using namespace std;
class Student {
private:
char name[20];
int age;
int id;
char c;
float first,second,third,fouth;
float average;
public:
void input()
{
cin.getline(name,20,',');
cin>>age>>c>>id>>c;
cin>>first>>c>>second>>c>>third>>c>>fouth;
}
void calculate()
{
average=(first+second+third+fouth)/4;
}
void output()
{
cout<<name<<',';
cout<<age<<','<<id<<','<<average<<endl;
}
};
int main() {
Student student; // 定义类的对象
student.input(); // 输入数据
student.calculate(); // 计算平均成绩
student.output(); // 输出数据
}
程序填空,使其输出9 22 5
#include
using namespace std;
class Sample {
public:
int v;
// 在此处补充你的代码
};
void PrintAndDouble(Sample o)
{
cout << o.v;
cout << endl;
}
int main()
{
Sample a(5);
Sample b = a;
PrintAndDouble(b);
Sample c = 20;
PrintAndDouble(c);
Sample d;
d = a;
cout << d.v;
return 0;
}
输入
无
输出
9
22
5
样例输入
None
样例输出
9
22
5
首先Sample(const Sample& s)就是复制构造函数,并且在const情况下可以是常量
2.
3. 赋值语句不会导致赋值构造函数被调用
1.complex c2(c1)与complex c2 = c1是一个效果,这里是定义一个对象并对其初始化,会调用复制构造函数
2.CMyclass c1,c2; c1.n = 5; c2 = c1这里是赋值语句,不调用复制构造函数
#include
using namespace std;
class Sample {
public:
int v;
Sample()
{
v = 0;
}
Sample(int x)
{
v = x;
}
Sample(const Sample& s)
{
v = s.v + 2;
}
};
void PrintAndDouble(Sample o)
{
cout << o.v;
cout << endl;
}
int main()
{
Sample a(5);
Sample b = a;//调用了复制构造函数
PrintAndDouble(b);//调用了复制构造函数
Sample c = 20;
PrintAndDouble(c);//调用了复制构造函数
Sample d;
d = a;
cout << d.v;
return 0;
}
下面程序的输出是:
3+4i
5+6i
请补足Complex类的成员函数。不能加成员变量。
#include
#include
#include
using namespace std;
class Complex {
private:
double r,i;
public:
void Print() {
cout << r << "+" << i << "i" << endl;
}
// 在此处补充你的代码
};
int main() {
Complex a;
a = "3+4i"; a.Print();
a = "5+6i"; a.Print();
return 0;
}
输入
无
输出
3+4i
5+6i
#include
#include
#include
using namespace std;
class Complex {
private:
double r,i;
public:
void Print() {
cout << r << "+" << i << "i" << endl;
}
Complex()
{
r = 0;
i = 0;
}
Complex(char s[])
{
r = s[0]-'0';
i = s[2]-'0';
}
};
int main() {
Complex a;
a = "3+4i"; a.Print();
a = "5+6i"; a.Print();
return 0;
}
描述
程序填空,输出指定结果
#include
using namespace std;
class A {
public:
int i;
A(int x) { i = x; }
// 在此处补充你的代码
};
int main()
{
A a(1);
A * pa = new A(2);
delete pa;
return 0;
}
输入
无
输出
2
1
A * pa = new A(2);这里的2相对于给pa指向地址的值用构造函数初始化,
A * pa = new A[2];这里是分配一个有两个元素的数组
#include
using namespace std;
class A {
public:
int i;
A(int x) { i = x; }
~A()
{
cout<<i<<endl;
}
};
int main()
{
A a(1);
A * pa = new A(2);
delete pa;
return 0;
}