您的位置:首页 > Web前端

林锐书:写一个hello world by seasoned professional

2013-11-04 18:07 369 查看
#include <iostream>
#include <string.h>
using namespace std;

class String
{
private:
int size;
char *ptr;
public:
String():size(0),ptr(new char('\0'))
{ cout << "default\n"; }

String(const String &s):size(s.size)
{
cout << "1 param constructor\n";
ptr = new char[size + 1];
strcpy(ptr,s.ptr);
}

//my code
String(char *s)
{
cout << "2 param constructor\n";
ptr = new char[strlen(s) + 1];
strcpy(ptr,s);
}

~String()
{
delete []ptr;
}

friend ostream& operator<<(ostream &,const String & );
String& operator=(const String &s);
};

//c++ primer第四版中文,435页
//14.2.1 输出操作符的重载:为了与io标准库一直,操作符应接受ostream&作为第一个参数,对类类型const对象的引用作为第2个参数,并返回对ostream形参的引用。
/*friend*/ ostream& operator<<(ostream & os,const String &s)  //这里的friend去掉了!就像类内的static在外面定义时要去掉一样。
//不去掉的话会报错 error: ‘friend’ used outside of class
{
return (os << s.ptr);
}

String& String::operator=(const String &s)
{
cout << "operator=\n";
if(this != &s)
{
delete []ptr;
ptr = new char[strlen(s.ptr) + 1];
strcpy(ptr,s.ptr);
}
return *this;
}

int main()
{
String s1 = "hello world";
String s2 = s1;
s2 = s1;

cout << s1 <<endl;
cout << s2 <<endl;

return 0;
}

/work/ctest/public_private$ ./1
2 param constructor
1 param constructor
operator=
hello world
hello world



/work/ctest/public_private$ ./1
2 param constructor
1 param constructor
operator=
hello world
hello world

下面的是林锐的书的原来的代码

#include <iostream>
#include <string.h>
using namespace std;

class String
{
private:
int size;
char *ptr;

public:
String():size(0),ptr(new char('\0'))
{ cout << "default\n"; }

String(const String &s):size(s.size)
{
cout << "1 param constructor\n";
ptr = new char[size + 1];
strcpy(ptr,s.ptr);
}

~String()
{
delete []ptr;
}

friend ostream& operator<<(ostream &,const String & );
String& operator=(const char *s);
};

ostream& operator << (ostream & os,const String &s)
{
return (os << s.ptr);
}

String& String::operator=(const char *s)
{
cout << "operator=\n";
//if(this != &s)//这一行代码要注释掉,不然会 error: comparison between distinct pointer types ‘String*’ and ‘const char**’ lacks a cast
{
delete []ptr;
ptr = new char[strlen(s) + 1];
strcpy(ptr,s);
}
return *this;
}

int main()
{
String s1 ;
s1 = "Hello World";

cout << s1 <<endl;

return 0;
}


/work/ctest/public_private$ ./1
default
operator=
Hello World
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: