程序设计与算法(三)C++面向对象程序设计 第四周题目讲解

001:MyString

很经典的题目,考察深拷贝,运算符重载

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class MyString {
	char* p;
public:
	MyString(const char* s) {
		if (s) {
			p = new char[strlen(s) + 1];
			strcpy(p, s);
		}
		else
			p = NULL;
	}
	~MyString() { if (p) delete[] p; }

	MyString(const MyString& s) {              // 拷贝构造
		if (s.p) {
			p = new char[strlen(s.p) + 1];
			strcpy(p, s.p);
		}
		else
			p = NULL;
	}

	void Copy(const char* s) {
		if (s == p) return;
		delete[] p;
		p = new char[strlen(s) + 1];
		strcpy(p, s);
	}

	MyString& operator = (const char* s) {
		if (p == s) return *this;
		delete[] p;
		p = new char[strlen(s) + 1];
		strcpy(p, s);
		return *this;
	}

	MyString& operator = (const MyString& s) {
		if (p == s.p) return *this;
		delete[] p;
		p = new char[strlen(s.p) + 1];
		strcpy(p, s.p);
		return *this;
	}

	friend ostream& operator<<(ostream& os, MyString s) {
		os << s.p;
		return os;
	}

};
int main()
{
	char w1[200], w2[100];
	while (cin >> w1 >> w2) {
		MyString s1(w1), s2 = s1;
		MyString s3(NULL);
		s3.Copy(w1);
		cout << s1 << "," << s2 << "," << s3 << endl;

		s2 = w2;
		s3 = s2;
		s1 = s3;
		cout << s1 << "," << s2 << "," << s3 << endl;

	}
}

003:惊呆!Point竟然能这样输入输出

#include <iostream> 
using namespace std;
class Point {
private:
	int x;
	int y;
public:
	Point() { };
	// 在此处补充你的代码
	friend istream &  operator>>(istream& is, Point& p) {
		is >> p.x >> p.y;
		return is;
	}

	friend ostream&  operator <<(ostream& os, Point &p) {
		os << p.x << "," << p.y;
		return os;
	}

};


int main()
{
	Point p;
	while (cin >> p) {
		cout << p << endl;
	}
	return 0;
}

003:惊呆!Point竟然能这样输入输出

运算符重载题目

#include <iostream> 
using namespace std;
class Point {
private:
	int x;
	int y;
public:
	Point() { };
	// 在此处补充你的代码
	friend istream &  operator>>(istream& is, Point& p) {
		is >> p.x >> p.y;
		return is;
	}

	friend ostream&  operator <<(ostream& os, Point &p) {
		os << p.x << "," << p.y;
		return os;
	}

};


int main()
{
	Point p;
	while (cin >> p) {
		cout << p << endl;
	}
	return 0;
}

002:看上去好坑的运算符重载

这道题略有难度,运算符重载连续减号,需要返回*this

同时重载了一个int()类型转换运算符。

#include <iostream> 
using namespace std;
class MyInt
{
	int nVal;
public:
	MyInt(int n) { nVal = n; }
	// 在此处补充你的代码
	MyInt& operator-(int n) {
		nVal -= n;
		return *this;
	}
	operator int() {
		return nVal;
	}
};
int Inc(int n) {
	return n + 1;
}
int main() {
	int n;
	while (cin >> n) {
		MyInt objInt(n);
		objInt - 2 - 1 - 3;
		cout << Inc(objInt);
		cout << ",";
		objInt - 2 - 1;
		cout << Inc(objInt) << endl;
	}
	return 0;
}

004:第四周程序填空题3

实现一个二维数组

使用一维数组加上运算符重载,模拟出一个二维数组

其中涉及到一段深拷贝

#include <iostream>
#include <cstring>
using namespace std;

class Array2 {
	// 在此处补充你的代码
private:
	int _row;
	int _col;
	int* _nums;
public:
	Array2() :_row(0), _col(0),_nums(nullptr){}
	Array2(int row, int col):_row(row),_col(col) {
		_nums = new int[_row * _col];
	}
	int* operator[](int i) {
		return _nums + i * _col;
	}
	int operator()(int i, int j) {
		return *(_nums + i * _col + j);
	}
	Array2& operator = (const Array2& a) {
		if (_nums == a._nums) return *this;
		_row = a._row;
		_col = a._col;
		delete _nums;
		_nums = new int[_row * _col];
		memcpy(_nums, a._nums, sizeof(int)*_row * _col);
		return *this;
	}
	~Array2() {
		delete[] _nums;
	}
};

int main() {
	Array2 a(3, 4);
	int i, j;
	for (i = 0; i < 3; ++i)
		for (j = 0; j < 4; j++)
			a[i][j] = i * 4 + j;
	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 4; j++) {
			cout << a(i, j) << ",";
		}
		cout << endl;
	}
	cout << "next" << endl;
	Array2 b;     b = a;
	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 4; j++) {
			cout << b[i][j] << ",";
		}
		cout << endl;
	}
	return 0;
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值