最近在复习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 & operator =(const MyString & m)
{
if(p)
delete [] p;
if(m.p)
{
p=new char[strlen(m.p)+1];
strcpy(p,m.p);
}
else
p=NULL;
}
void Copy(const char *s)
{
if(p)
delete [] p;
if(s)
{
p=new char[strlen(s)+1];
strcpy(p,s);
}
else
p=NULL;
}
friend ostream & operator <<(ostream & o,const MyString & m )
{
if(m.p)
cout<<m.p;
return o;
}
MyString & operator =(const char * s)
{
if(p)
delete [] p;
if(s)
{
p=new char[strlen(s)+1];
strcpy(p,s);
}
else
p=NULL;
}
MyString(const MyString& s) {
if (s.p) {
p = new char[strlen(s.p) + 1];
strcpy(p, s.p);
}
else
p = NULL;
}
};
int main()
{
char w1[200],w2[100];
while( cin >> w1 >> w2) {
MyString s1(w1),s2 = s1;//第一个调用构造函数,第二个要重载”=“,参数是MyString&;同时调用了**复制构造函数**
MyString s3(NULL);//调用构造函数
s3.Copy(w1);//Copy函数
cout << s1 << "," << s2 << "," << s3 << endl;//需要重载<<;
s2 = w2;//需要重载=,参数为char*
s3 = s2;
s1 = s3;
cout << s1 << "," << s2 << "," << s3 << endl;
}
}
一开始写的代码出现了runtime error
看了别人的代码发现,没注意到复制构造函数的调用
002:看上去好坑的运算符重载
#include <iostream>
using namespace std;
class MyInt
{
int nVal;
public:
MyInt( int n) { nVal = n ;}
//补充代码
MyInt & operator -(const 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);//需要重载类型转换运算符int
cout <<",";
objInt-2-1;
cout << Inc(objInt) << endl;
}
return 0;
}
003:惊呆!Point竟然能这样输入输出
#include <iostream>
using namespace std;
class Point {
private:
int x;
int y;
public:
Point() { };
// 补充代码,这道题和课件里讲的差不多,就只是流输入输出运算符重载
friend istream & operator >>(istream & i,Point & p)
{
int a,b;
i>>a>>b;
p.x=a;
p.y=b;
return i;
}
friend ostream & operator <<(ostream & o,const Point & p)
{
o<<p.x<<","<<p.y;//因为这里多了个endl结果Presentation Error了,oj真的严格
return o;
}
};
int main()
{
Point p;
while(cin >> p) {//需要重载>>
cout << p << endl;//需要重载<<
}
return 0;
}
004:第四周程序填空题3
这一题我用了很久,主要是太长时间不用以前的知识都忘光了。
一开始想着建二维数组,但是很麻烦,才反应过来一维数组就可以了。这样大部分函数都和视频里面讲的差不多,模仿写就可以了。
但是关于[]到底如何重载的问题我想了很久,一直陷入了重载函数需要使用两次的思维怪圈。最后还是去参考了其他人的代码,才恍然大悟,果然大一学的C语言指针数组之类的都就饭吃了(-_-||)。下面是代码:
#include <iostream>
#include <cstring>
using namespace std;
class Array2 {
// 在此处补充你的代码
public:
int size_m;
int size_n;
int *ptr;
Array2(int i=0,int j=0):size_m(i),size_n(j)
{
if(size_m==0||size_n==0)
ptr=NULL;
else
ptr=new int[size_m*size_n];
}
~Array2()
{
if(ptr)
delete [] ptr;
}
Array2(Array2 & a)
{
if(!a.ptr)
{
size_m=size_n=0;
ptr=NULL;
}
else
{
ptr=new int[a.size_m*a.size_n];
memcpy(ptr,a.ptr,sizeof(int)*a.size_m*a.size_n);
size_m=a.size_m;
size_n=a.size_n;
}
}
int * operator [](int i)
{
return (ptr+i*size_n);
}
Array2 & operator =(const Array2 &a)
{
if(a.ptr==ptr)
{
return *this;
}
if(!a.ptr)
{
if(ptr)
delete [] ptr;
size_m=size_n=0;
ptr=NULL;
return *this;
}
else
{
delete [] ptr;
ptr=new int[a.size_m*a.size_n];
memcpy(ptr,a.ptr,sizeof(int)*a.size_m*a.size_n);
size_m=a.size_m;
size_n=a.size_n;
return *this;
}
}
int operator ()(int i,int j)
{
return ptr[i*size_n+j];
}
};
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;
}