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