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