String String::operator + (const char* s)const { String ret; long long len = m_length + strlen(s ? s : ""); char* new_str = reinterpret_cast<char*>(malloc(len+1)); if(new_str) { strcpy(new_str,m_str); strcat(new_str,s ? s : ""); free(ret.m_str); ret.m_str = new_str; ret.m_length = len;} else {//THROW_EXCEPTION(NoEnoughMemoryException,"No memory to creat new element ..."); cout<<"没有足够的内存异常,“没有内存来创建新元素"<<endl; }return ret;}
时间: 2024-03-18 16:43:50 浏览: 45
这是一个 C++ 中的字符串类 String 中的重载运算符 +,其作用是将两个字符串进行连接。具体实现如下:
1. 首先创建一个新的 String 对象 ret,用于存储连接后的字符串;
2. 然后计算出连接后的字符串的长度,为原有字符串 m_str 的长度加上第二个字符串 s 的长度(如果 s 为空,则将长度置为 0);
3. 分配空间,将原有字符串 m_str 和第二个字符串 s 拼接起来,并存储到新的内存空间 new_str 中;
4. 如果内存分配成功,将 ret 对象中原有的字符串 m_str 释放,并将新的内存空间 new_str 赋值给 ret 对象的 m_str 成员变量,并更新 ret 对象的 m_length 成员变量;
5. 如果内存分配失败,则输出错误信息并抛出异常;
6. 最后返回新的 String 对象 ret。
需要注意的是,在第 3 步中,如果第二个字符串 s 为空,则需要将长度置为 0,否则使用 strlen() 函数计算字符串长度时会出现错误。同时,在第 4 步中,需要释放 ret 对象中原有的字符串 m_str,否则会造成内存泄漏。
相关问题
填充下面这个程序中所有出现// TODO: fill the code这个任务的地方#include <iostream> #include <cstring> #include "ourstring.h" #include "strlib.h" using namespace std; OurString::OurString(){ // TODO: fill the code } OurString::OurString(const char *str){ // TODO: fill the code } OurString::OurString(const OurString &dstr){ // TODO: fill the code } OurString::~OurString(){ // TODO: fill the code } string OurString::toString() const{ // TODO: fill the code } OurString OurString::subStr(unsigned int start, unsigned int n) const{ // TODO: fill the code } bool OurString::operator > (const OurString &dstr) const{ // TODO: fill the code } bool OurString::operator < (const OurString &dstr) const{ // TODO: fill the code } bool OurString::operator == (const OurString &dstr) const{ // TODO: fill the code } unsigned int OurString::length () const{ // TODO: fill the code } const OurString& OurString::operator = (const OurString &dstr){ // TODO: fill the code } const OurString& OurString::operator = (const char *str){ // TODO: fill the code } char& OurString::operator[](int index){ // TODO: fill the code } const OurString OurString::operator + (const OurString &dstr) const{ // TODO: fill the code } const OurString OurString::operator + (const char *str) const{ // TODO: fill the code } const OurString& OurString::operator += (const OurString &dstr){ // TODO: fill the code } const OurString& OurString::operator += (const char *str){ // TODO: fill the code } ostream & operator<<(ostream &os, const OurString &dstr){ // TODO: fill the code } istream & operator>>(istream &is, OurString &dstr){ // TODO: fill the code }
好的,下面是填充后的代码,每个 TODO 已经被替换成相应的实现:
```c++
#include <iostream>
#include <cstring>
#include "ourstring.h"
#include "strlib.h"
using namespace std;
OurString::OurString(){
str = new char[1];
str[0] = '\0';
}
OurString::OurString(const char *str){
this->str = new char[strlen(str)+1];
strcpy(this->str, str);
}
OurString::OurString(const OurString &dstr){
this->str = new char[dstr.length()+1];
strcpy(this->str, dstr.str);
}
OurString::~OurString(){
delete [] str;
}
string OurString::toString() const{
return string(str);
}
OurString OurString::subStr(unsigned int start, unsigned int n) const{
if (start >= length()) return OurString();
n = (n > length() - start) ? length() - start : n;
return OurString(str + start, str + start + n);
}
bool OurString::operator > (const OurString &dstr) const{
return strcmp(str, dstr.str) > 0;
}
bool OurString::operator < (const OurString &dstr) const{
return strcmp(str, dstr.str) < 0;
}
bool OurString::operator == (const OurString &dstr) const{
return strcmp(str, dstr.str) == 0;
}
unsigned int OurString::length () const{
return strlen(str);
}
const OurString& OurString::operator = (const OurString &dstr){
if (this != &dstr) {
delete [] str;
str = new char[dstr.length()+1];
strcpy(str, dstr.str);
}
return *this;
}
const OurString& OurString::operator = (const char *str){
if (this->str != str) {
delete [] this->str;
this->str = new char[strlen(str)+1];
strcpy(this->str, str);
}
return *this;
}
char& OurString::operator[](int index){
return str[index];
}
const OurString OurString::operator + (const OurString &dstr) const{
OurString s;
s.str = new char[length() + dstr.length() + 1];
strcpy(s.str, str);
strcat(s.str, dstr.str);
return s;
}
const OurString OurString::operator + (const char *str) const{
OurString s;
s.str = new char[length() + strlen(str) + 1];
strcpy(s.str, this->str);
strcat(s.str, str);
return s;
}
const OurString& OurString::operator += (const OurString &dstr){
*this = *this + dstr;
return *this;
}
const OurString& OurString::operator += (const char *str){
*this = *this + str;
return *this;
}
ostream & operator<<(ostream &os, const OurString &dstr){
os << dstr.str;
return os;
}
istream & operator>>(istream &is, OurString &dstr){
string s;
is >> s;
dstr = s.c_str();
return is;
}
```
解释这一段代码:String String::operator+(const String& s) { String temp; temp.str = new char[strlen(str) + strlen(s.str) + 1]; strcpy(temp.str,str); strcat(temp.str, s.str); return temp; }
这是一个重载运算符 "+", 用于将两个字符串对象进行拼接操作。具体解释如下:
1. `String String::operator+(const String& s)` : 定义了一个名为 "+" 的运算符函数,它的参数是一个常量引用 `s`,表示另外一个字符串对象。
2. `String temp;` : 定义了一个名为 `temp` 的字符串对象。
3. `temp.str = new char[strlen(str) + strlen(s.str) + 1];` : 动态分配了一段内存,用于存放两个字符串对象拼接后的结果。需要注意的是,为了保证字符串结尾符号 '\0' 的存在,分配的内存大小必须是两个字符串长度之和再加上 1。
4. `strcpy(temp.str, str);` : 将调用该运算符函数的字符串对象的内容复制到 `temp` 对象的内存中。
5. `strcat(temp.str, s.str);` : 将参数 `s` 对象的内容追加到 `temp` 对象的内存中,实现了字符串的拼接操作。
6. `return temp;` : 返回一个新的字符串对象,该对象的内容为两个字符串对象的拼接结果。需要注意的是,返回的对象是通过动态内存分配创建的,因此调用者在使用完该对象后,需要负责释放相应的内存。
阅读全文