定义一个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
};
请提交类的定义及其完整实现。
无
ccccc Hello! 1
请认真理解类的构造函数、重载、静态成员变量及其初始化以及new和delete的使用、深拷贝。测试数据中不会发生内存不够的现象。
主函数形式如下:
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;
}
#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;
}