1000. MyString Class

3358 ワード

Description
次のようにMyStringクラスを定義します.このクラスには、構造関数、コピー構造関数、構造関数、メンバー関数、および静的メンバー関数があり、C文字列ポインタ変数と静的メンバー変数numberOfObjectsがあります.クラスの実装を完了してください.
class MyString
{
public:
    MyString(const char*);
    MyString(int = 0, char = '\0'); //initialize size_t number of char, terminated with '\0'
    MyString(const MyString&);          //copy constructor
    ~MyString();                                         //destructor
    const char* c_str();                  //return private char*
    static int getNumberOfObjects();
private:
    char *str;
    static int numberOfObjects;            //count the number of MyString objects
};
クラスの定義とその完全な実装を提出してください.
 
Sample Input
 

Sample Output
ccccc
Hello!
1

Hint
クラスのコンストラクション関数、リロード、静的メンバー変数、およびその初期化、newおよびdeleteの使用、深いコピーをよく理解してください.テストデータにメモリ不足は発生しません.
主関数の形式は、int main(){MyString ms 1(5,'c');cout<c_str() << endl;     delete ptr_ms2;     cout << MyString::getNumberOfObjects() << endl;         return 0; }
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
class MyString
{

public:

    MyString(const char*);

    MyString(int = 0, char = '\0');  //initialize size_t number of char, terminated with '\0'

    MyString(const MyString&);           //copy constructor

    ~MyString();                                          //destructor

    const char* c_str();                   //return private char*

    static int getNumberOfObjects();

private:

    char *str;//                 。      new    。 
    static int numberOfObjects;             //count the number of MyString objects

};

int MyString::numberOfObjects=0;

MyString::MyString(const char* MyChar)
{
	str=new char[strlen(MyChar)];
    strcpy(str,MyChar);//ok
	//str= MyChar;
	numberOfObjects++;
}
MyString::MyString(int length, char tail)
{
	numberOfObjects++;
	str=new char[length];
	for(int i=0;i<length;i++)
	{
		str[i]=tail;
	}
	str[length]='\0';
	//    string   char*    .
	/*numberOfObjects++;
	string ss;
	str=new char[length];
	for(int i=0;i<length;i++)
	{
		ss+=tail;
	}
	ss.copy(str,length,0);
	str[length]='\0'; 
	*/
}

MyString::MyString(const MyString& mystring)
{
	str=new char[strlen(mystring.str)];//    !
	strcpy(str,mystring.str);          //                      。 
	numberOfObjects++;
	mystring.numberOfObjects=numberOfObjects;
	//mystring.str=str;  str   ,    =  。 
}

MyString::~MyString()  
{
	numberOfObjects--;
}                                     

const char* MyString::c_str() 
{
	return str;
}               

int MyString::getNumberOfObjects()
{
	return numberOfObjects;
}
int main()
{
      MyString ms1(5, 'c');
       cout << ms1.c_str() << endl;
       MyString *ptr_ms2 = new MyString("Hello!");
    {
        MyString ms3(ms1);
    }
    cout << ptr_ms2->c_str() << endl;
    delete ptr_ms2;
    cout << MyString::getNumberOfObjects() << endl;
        return 0;
}