jeans chen
we've got them by the balls
#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

 

 

posted on 2013-11-04 18:07  jeans chen  阅读(437)  评论(0)    收藏  举报