1000. MyString Class

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



<think>好的,用户现在问的是关于“mystring”的介绍。首先,我需要确定用户指的到底是什么。因为“mystring”并不是Java标准库中的,所以可能的情况有两种:一种是用户自己定义一个定义字符串,另一种可能是某些教材或课程中作为示例的。 接下来,我需要考虑用户可能的背景。用户之前询问过数据结构与算法的Java入门知识,现在继续提问,可能是在学习过程中遇到了自定义字符串的实现问题,或者想要了解如何自己实现似String的功能。因此,用户的需求可能是想了解如何创建一个似String的,或者理解自定义字符串的结构和常用方法。 然后,我需要分析用户可能的具体问题。用户可能想知道如何设计这样的,包括基本结构、构造方法、常用方法(如长度、拼接、比较、子串等)。还可能关心内存管理,比如深拷贝与浅拷贝的区别,这在字符串的实现中很重要,因为字符串通常涉及字符数组的操作。 另外,用户可能对为什么需要自定义字符串有疑问,比如标准库的String已经很完善了,为什么还要自己实现。这时候需要解释学习的目的,比如加深理解、练习面向对象编程、或者特定需求的优化。 接下来,我需要组织回答的结构。先解释mystring可能的定义,然后给出一个示例代码,展示基本结构和方法。接着比较与Java String的区别,说明自定义的意义。最后,总结适用的场景,比如教学或特殊需求。 同时,需要注意用户之前的问题中提到的格式要求,比如行内公式用$...$,独立公式单独成段。不过在这个问题中可能不太涉及数学公式,但代码部分需要用正确的Java语法,并确保结构清晰。 另外,用户可能存在的误区需要指出,比如浅拷贝可能导致的问题,或者性能上的考虑,比如拼接操作的效率。这时候在示例代码中加入深拷贝的实现,并解释原因,可以帮助用户避免常见错误。 最后,检查是否有遗漏的常用方法,比如子串、查找字符位置等,确保示例的完整性。同时,提醒用户实际开发中优先使用标准库,但自定义有助于学习,这样用户能明确使用场景。</think>以下是关于自定义 **`MyString` **的入门介绍,这通常用于模拟Java内置的 `String` 型的功能,帮助理解字符串底层实现原理。 --- ### 一、`MyString` 定义 `MyString` 是一个**定义的字符串**,主要用于学习字符串的底层操作(如字符数组存储、方法封装等)。以下是其核心设计思路: #### 1. **基本结构** ```java public class MyString { private char[] value; // 字符数组存储实际字符串内容 private int length; // 记录字符串长度 // 构造方法:通过字符数组初始化 public MyString(char[] chars) { this.value = Arrays.copyOf(chars, chars.length); this.length = chars.length; } // 构造方法:通过Java内置String初始化 public MyString(String str) { this.value = str.toCharArray(); this.length = str.length(); } } ``` #### 2. **常用方法实现** - **获取长度** ```java public int length() { return this.length; } ``` - **拼接字符串** ```java public MyString concat(MyString other) { char[] newValue = new char[this.length + other.length]; System.arraycopy(this.value, 0, newValue, 0, this.length); System.arraycopy(other.value, 0, newValue, this.length, other.length); return new MyString(newValue); } ``` - **比较字符串是否相等** ```java public boolean equals(MyString other) { if (this.length != other.length) return false; for (int i = 0; i < this.length; i++) { if (this.value[i] != other.value[i]) return false; } return true; } ``` - **获取子串** ```java public MyString substring(int start, int end) { if (start < 0 || end > this.length) throw new IndexOutOfBoundsException(); char[] subArray = Arrays.copyOfRange(this.value, start, end); return new MyString(subArray); } ``` --- ### 二、与Java `String` 的区别 | 特性 | `MyString`(自定义) | Java `String`(标准库) | |---------------------|---------------------------|------------------------------| | **可变性** | 通常设计为可变(需自行控制) | 不可变(线程安全) | | **内存管理** | 需手动处理深拷贝/浅拷贝 | 自动优化(字符串池、不可变) | | **方法实现** | 需自行编写功能逻辑 | 提供丰富内置方法(如`split()`)| --- ### 三、为何需要自定义字符串? 1. **学习目的** - 理解字符串的底层存储(如字符数组操作)。 - 掌握深拷贝与浅拷贝的区别(例如构造方法中的 `Arrays.copyOf`)。 2. **特殊需求** - 实现特定功能(如高效拼接、自定义编码)。 --- ### 四、示例代码:测试 `MyString` ```java public class Main { public static void main(String[] args) { MyString str1 = new MyString("Hello"); MyString str2 = new MyString("World"); MyString combined = str1.concat(str2); System.out.println(combined); // 需要重写toString()方法 } } ``` --- ### 五、总结 - **适用场景**:教学、算法练习、特殊字符串处理需求。 - **实际开发**:优先使用Java内置的 `String` 或 `StringBuilder`,因其经过高度优化。 如果需要更具体的实现细节(如内存优化或线程安全设计),可以进一步探讨!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值