Coding In C++, Day04

/*
 * String练习
 */
#include <iostream>
#include <cstring>
using namespace std;
class String {
public:
	String (const char* str = NULL) {
		m_str = new char[strlen(str?str:"")+1];
		strcpy (m_str, str ? str : "");
	}
	~String (void) {
		if (m_str) {
			delete[] m_str;
			m_str = NULL;
		}
	}
	String (const String& that) :
		m_str (strcpy (
			new char[strlen(that.m_str)+1],
			that.m_str)) {}
	/* 菜鸟
	void operator= (const String& that) {
		m_str = new char[strlen(that.m_str)+1];
		strcpy (m_str, that.m_str);
	}*/
	String& operator= (const String& that) {
		if (&that != this) {
			/* 小鸟
			delete[] m_str;
			m_str = new char[strlen(that.m_str)+1];
			strcpy (m_str, that.m_str);
			*/
			/* 大鸟
			char* str = 
				new char[strlen(that.m_str)+1];
			delete[] m_str;
			m_str = strcpy (str, that.m_str);
			*/
			// 老鸟
			String temp (that);
			swap (m_str, temp.m_str);
		}
		return *this;
	}
	const char* c_str (void) const {
		return m_str;
	}
private:
	char* m_str;
};

int main (void) {
	String s1 ("Hello, World !");
	cout << s1.c_str () << endl;
	String s2 = s1;
	cout << s2.c_str () << endl;
	String s3 ("Hello, Linux !");
	try {
		s1 = s3;
	}
	catch (exception& ex) {
		cout << ex.what () << endl;
	}
	cout << s1.c_str () << endl;
	return 0;
}
/*
 *string练习
 */
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main (void) {
	string s1 ("hello");
	string s2 = "world";
	(s1 += " ") += s2;
	cout << s1 << endl;
	string s3 = s1;
	cout << s3 << endl;
	cout << (s1 == s3) << endl;
	s3[0] = 'H';
	cout << s3 << endl;
	cout << (s1 > s3) << endl;
	cout << s1.length () << endl;
	cout << (s1 == s3) << endl;
	cout << (strcasecmp (s1.c_str (),
		s3.c_str ()) == 0) << endl;
	cout << sizeof (s1) << endl;
	FILE* fp = fopen ("string.txt", "w");
//	fwrite (&s3, sizeof (s3), 1, fp);
	fwrite (s3.c_str (), sizeof (char),
		s3.length (), fp);
	fclose (fp);
	return 0;
}

/*
 * 我实现的String类
 * 文件名:String.h
 * */
#ifndef _STRING_H__
#define _STRING_H__
class C_String{
    public:
	C_String(void);
	C_String(const char*);
	C_String(const C_String&);
	~C_String(void);
	C_String& operator=(const C_String &);
	const char* c_str(void);
	
    private:
	unsigned mun_length;
	char * mp_str;
	
};
#endif	//_STRING_H___

/*
 * 文件名:String.cpp
 * */
#include "C_String.h"
#include <iostream>

using namespace std;

C_String::C_String(void)
{
    mp_str = new char('\0');
    cout <<"构造函数C_String(void)已经执行"<< endl;
}

C_String::C_String(const char * str_source)
{
    int i = 0;
    for (i = 0; *(str_source + i) != '\0'; i++)
	;
    mun_length = i - 1;
    mp_str = new char[i];
    if (mp_str) {
	for ( ; i >= 0; --i)
	    mp_str[i] = str_source[i];
    }
    cout <<"构造函数C_String(conts char *)已经执行"<< endl;
}
C_String::~C_String(void)
{
    if (mp_str) {
    mun_length = 0;
    delete[] mp_str;
    cout <<"析构函数~C_String(void)" << endl;
    }
}

C_String::C_String(const C_String& i_source)
{
    int i = 0;
    mun_length = i_source.mun_length;
    mp_str = new char[mun_length + 1];
    if (mp_str) {
	for (i = mun_length + 1; i >= 0; --i)
	    mp_str[i] = i_source.mp_str[i];
    }
    cout <<"构造函数C_String(conts C_String&)已经执行,这是一个拷贝构造"<< endl;
}

C_String& C_String::operator=(const C_String &i_source)
{
    int i = 0;
    mun_length = i_source.mun_length;
    if (&i_source != this) {
	delete[] mp_str;
	mp_str = new char[mun_length + 1];
	if (mp_str) {
	    for (i = mun_length + 1; i >= 0; --i)
		mp_str[i] = i_source.mp_str[i];
	}
    }
    cout <<"拷贝赋值函数C_String& operator=(const C_String &)已经执行" << endl;

    return *this;
}

const char* C_String::c_str(void)
{
    return mp_str;
}

/*
 * 文件名: main.cpp
 * 描述:测试我的String类实现
 * */
#include <iostream>
#include "C_String.h"

using namespace std;

    void print(const char*);
    C_String print(C_String);
int main()
{

    cout <<"构造i_string1" << endl;
    C_String i_string1;
    //C_String(print(i_string1));//会造成段错误,print返回的是一个匿名对象,依据该匿名对象再构造一个匿名对象会报段错误。
    C_String i = C_String(print(i_string1));//gcc优化代码,使得print返回的匿名对象命名为i
    C_String("pini_ig)");//对于构造的该匿名对象,会被立即析构掉


    cout << "打印普通字符数组p_str" << endl;
    const char *p_str = "Hello World!";
    print(p_str);

    cout <<"用普通字符数组p_str来构造i_string2" << endl;
    C_String i_string2 = p_str;
    print(i_string2);

    cout <<"拷贝i_string2来构造i_string3"<< endl;
    C_String i_string3 = i_string2;
    print(i_string3);

    cout <<"拷贝i_string3来构造i_string4"<<endl;
    C_String i_string4(i_string3);
    print(i_string3);

    cout <<"用\"LIBIN\"构造i_string5" << endl;
    C_String i_string5("LIBIN");
    print(i_string5);
    
    cout <<"i_string4 = i_string5" << endl;
    i_string4 = i_string5;
    print(i_string4);


}

C_String print(C_String i_string)
{
    cout << i_string.c_str() << endl;
    cout <<"CLASS" << endl;
    return i_string;
}

void print(const char *p_str)
{
    cout <<"!class"<<endl;
    cout << p_str << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值