【发布时间】:2017-04-24 22:28:08
【问题描述】:
我目前正在编写自己的 String 类。 这是标题
#pragma once
class String
{
private:
char* m_Beginning;
int m_Length;
public:
// Constructors
String();
String(const String&);
String(const char*);
// Destructor
~String();
// Operations
String& operator=(const String&);
String operator+(const String&)const;
String& operator+=(const String&);
char operator[](int _Index)const;
// Methods
void Append(const String&);
String Concatenate(const String&)const;
int Length()const { return m_Length; };
void Clear();
};
这是类描述
#include "String.h"
#include <cstring>
#include <iostream>
String::String()
{
m_Beginning = nullptr;
m_Length = 0;
}
String::String(const String& _String)
{
m_Length = _String.Length();
m_Beginning = new char[m_Length];
for (int i = 0; i < m_Length; ++i)
{
m_Beginning[i] = _String[i];
}
}
String::String(const char* _String)
{
m_Length = strlen(_String);
m_Beginning = new char[m_Length];
for (int i = 0; i < m_Length; ++i)
{
m_Beginning[i] = _String[i];
}
}
String::~String()
{
delete[] m_Beginning;
}
String& String::operator=(const String& _String)
{
Clear();
m_Length = _String.Length();
m_Beginning = new char[m_Length];
for (int i = 0; i < m_Length; ++i)
{
m_Beginning[i] = _String[i];
}
return *this;
}
String String::operator+(const String& _String)const
{
String NewString(*this);
NewString += _String;
return NewString;
}
String& String::operator+=(const String& _String)
{
for (int i = 0; i < _String.Length(); ++i)
{
m_Beginning[m_Length + i] = _String[i];
}
m_Length += _String.Length();
return *this;
}
char String::operator[](int _Index)const
{
return m_Beginning[_Index];
}
void String::Append(const String& _String)
{
*this += _String;
}
String String::Concatenate(const String& _String) const
{
return (*this + _String);
}
void String::Clear()
{
delete[] m_Beginning;
m_Beginning = nullptr;
m_Length = 0;
}
我想问的是如何覆盖运算符 [] 以便我为某个单元格设置一个值,而不仅仅是提取它。
str("ABCD");
str[2] = 'Z'; // and str will become "ABZD".
谢谢你:)
【问题讨论】:
-
旁注:如果您正在编写自己的带有运算符重载的类,我强烈建议您阅读Operator overloading 以使这些东西在惯用语上是正确的(并避免不断重复自己)。同样,对于资源管理类,您需要阅读 What is the copy-and-swap idiom? 以了解构造函数和赋值操作的相同正确性/简化。
-
所有以下划线开头并以多个下划线或大写字母开头的名称都保留用于任何范围的实现。您的程序格式不正确。
-
感谢您提供的信息。我会记住的:)
-
提示:您可以在en.cppreference.com/w/cpp/string/basic_string 查看 STL
std::basic_string的声明,以重用原型并编写自己的实现。
标签: c++ operator-overloading operator-keyword