【OpenJudge】程序设计与算法MOOC > C++面向对象程序设计 > 001~012题解析

解闷的小题,复习西加加

在这里插入图片描述

在这里插入图片描述
题目列表链接

001

考察引用

答案:

A & a, A & b

通过码

a73659346cb724c54bba9527a386d8769eaf6ccc4128d535a701c7e6bfba24db

002

在swap中,让pa指向b,让pb指向a

答案:

int * & a, int * & b

通过码

c8fafa476e80e03a6bd4c80c432655a7bbbaa48e6f32ca43e1f5036a3652a35b

003

本题考察引用

答案:

int &

通过码

6f5049b0b228ea57b097c009a73b7f7c0afa69ca7e3342cf543c552ba1d9ffc2

004

本题考察new

答案:

		nullptr,
		nullptr,
		new int,
		new int[6]

通过码

242f1c5e6121ae947705d5da3e8e62bec00813c518e95a26b87ed4699fd72449

005

答案:

private:

	int y1, y2, y3, y4;
	char * name;
	int age, id;
	double avg_y;

public:
	Student()
	{
		name = new char[21];
	}
	void input()
	{
		char c;
		char * p = name;
		while ((c = getchar()) != ',')
		{
			*p++ = c;
		}
		*p = '\0';
		scanf("%d,%d,%d,%d,%d, %d", &age, &id, &y1, &y2, &y3, &y4);
	}

	void calculate()
	{
		avg_y = (y1 + y2 + y3 + y4) * 1.0 / 4;
	}

	void output()
	{
		printf("%s,%d,%d,", name, age, id);
		cout << avg_y;
	}

通过码

464c9407fbcdb8808fdc02e3ae9ebc7b8476c58301610fc616eb026c0f637b16

006

要补充三个函数如下,abc为待定常数

	// 记为函数A
	Sample(int n) : v(n + a) {}

	// 记为函数B
	Sample(const Sample & s) {
		v = s.v + b;
	}

	// 记为函数C
	void operator = (const Sample & s) {
		v = s.v + c;
	}

由于:

int main()
{
	Sample a(5);		//调用A
	Sample b = a;		//调用B
	PrintAndDouble(b);	//调用B(请特别注意)
	Sample c = 20;		//调用A
	PrintAndDouble(c);	//调用B
	Sample d;
	d = a;				//调用C
	cout << d.v;
	return 0;
}

要满足:

5 + a + b + b = 9
20 + a + b = 22
5 + a + c = 5

得到:a = c = 0,b = 2

最终答案:

	Sample() {}
	Sample(int n) : v(n){}
	Sample(const Sample & s) {
		v = s.v + 2;
	}
	void operator = (const Sample & s) {
		v = s.v;
	}

通过码

70c40970ae423df5439fdf40d32c0ebb8b94f842b4be6df1ede8e0d055c8453f

007

同010题

通过码

34082975d020e746a3b8a72a2f47bc2e70e3e1de93cf19b34d777b8faf346d4a

008

本题需要重载赋值号

答案

	void operator = (const char * s)
	{
		r = s[0] - '0';
		i = s[2] - '0';
	}

通过码

7fc94c32202f7862b0ebd71e944a2cdc29dbf31c793d35766cd1ba22b74fa534

009

析构时输出成员变量i

答案:

	~A() { cout << i << endl; }

通过码

4a1e1900dc494e3ea85630825f942b09cced529baa9c1b035e7f3eb7db10c93a

010

  1. 123是a.val的初值,故先在类A中写无参构造函数,val初始化为123
  2. int类型和A类型的值都可以通过A的成员函数GetObj改变成员变量val的值,所以需要一个类型转换构造函数(题目里给了一半的那个函数)
  3. GetObj函数的返回类型为A引用,返回的值为*this

答案

		n) : val(n) {};

	A() : val(123) {};
	
	A & GetObj() {
		return *this;
	}

通过码

f6bc9dc937a4ab279f41955b10ac9339927790ac4e47357d26c61538c3499bdb

011

此题关于封闭类。Big a1(n);需要写一个构造函数。

答案:

	Big(int n) : v(n), b(n) {};

通过码

c9ac0b1137dced3a39341bb2b97443299f2ed84c7579a739143fce8eecf70255

012

此题能判断出在考察this指针,所以轻松写下:

	A * getPointer() {
		return this;
	}

然后考虑在哪加const(点击查看我写过的const辨析)

  1. 由调用时a.getPointer()的对象a是常对象,所以函数getPointer必须是常成员函数,故A * getPointer() ____ { 画线位置加const。
  2. 此时编译不过,原因是:因为a是常对象,意味着不可被改变,此时写法代表可以通过指针p来绕过a进行对对象a的成员的改写。故 _____ A * getPointer() const { 画线位置加const。
  3. 补充: const A * p = a.getPointer();中的const并不是添加第二条描述的那个const的本质原因,因为非const返回函数可以给到const变量。本质原因是getPointer函数返回的内容是this

最终答案:

	const A * getPointer() const {
		return this;
	}

通过码

60d4f05e487c17b13023e26d2c6b3183fc52f799a48f4a39e07419f3869321a6

---------------------------- 完 ----------------------------
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值