超载 运算符在C 中加入两个字符串(一些疑问)

Overloading + operator to concatenate two strings in C++ (Some doubts)

本文关键字:两个 字符串 运算符 超载      更新时间:2023-10-16

我几天前才开始学习C 。给我一个分配,以演示 运算符的超载,以连接两个字符串。我想出了这个解决方案:

#include <iostream>
using namespace std;
class Strcpy{
private:
    char* wrd;
    int len;
public:
    Strcpy();
    Strcpy(char* );
    void Display();
    friend Strcpy operator + (Strcpy, Strcpy);
    friend Strcpy concatinator(Strcpy, Strcpy);
};
Strcpy :: Strcpy(){
    wrd = '';
    len = 0;
}
Strcpy :: Strcpy(char* w){
    int i; len = 0;
    for(i = 0; w[i] != '' ; i++)
        len ++;
    wrd = w;
}
void Strcpy :: Display(){
    cout << "nOutput: " << wrd << " "<< len;
}

Strcpy operator + (Strcpy obj1, Strcpy obj2){
    Strcpy temp;
    int i;
    temp.wrd = new char[obj1.len + obj2.len];
    temp = concatinator(temp, obj1);
    temp = concatinator(temp, obj2);
    temp.wrd[temp.len] = '';
    return temp;
}
Strcpy concatinator(Strcpy obj, Strcpy temp){
    for(int i = 0; temp.wrd[i] != ''; i++)
        {
            obj.wrd[obj.len] = temp.wrd[i];
            obj.len++;
        }
    return obj;
}
int main(){
    Strcpy word, word_I("Hello"), word_II("World");
    word = word_I + word_II;
    word.Display();
    return 1;
}

有些要注意的事情:

  • 不推荐使用的转换从字符串常数到'char*'[-wwrite-strings] 我意识到这是因为我将不可变的类型转换为可变的类型,但是我可以尝试哪种替代方法摆脱这一点。
  • 我想避免使用朋友函数,但是重载的操作员需要两个参数,如果它仍然是类成员。
  • 即使更改,以下行也可以工作相同,为什么会发生这种情况:

    temp.wrd = new char[obj1.len + obj2.len];
    //changed to
    temp.wrd = new char[//any number here];
    
  • 我想避免使用字符串函数如果可能的话。

  • 每当我尝试以以下形式进行输入时,它就会崩溃:

    char* Strcpy :: get(){
        char* temp;
        cin >> temp;
        return temp;
    }
    int main(){
        Strcpy word;
        Strcpy word_I(word.get()), word_II(word.get());
        word = word_I + word_II;
        word.Display();
        return 1;
    }
    
  • 最后,我希望有任何帮助,这将有助于我改善现有解决方案和一些解释,以便为什么它更好和我犯的错误。

不弃用从字符串常数到'char*'[-wwrite-strings]的转换,我意识到这是由于我将不可变型类型转换为可变的类型而引起的,但是我可以尝试摆脱这种替代方法。<<<<<<<<<。/p>

您从不修改*w,因此可以使用指针来代替const。

我想避免使用朋友功能,但是超载运算符需要两个参数,如果它仍然是类成员。

成员操作员超载的第一个参数是隐式this指针。如果您声明Strcpy Strcpy::operator+(const Strcpy&) const,它将是二进制操作员。也就是说,朋友操作员可能是一种更好的方法。

即使更改了以下行也相同,为什么会发生这种情况:

temp.wrd = new char[obj1.len + obj2.len];
//changed to
temp.wrd = new char[//any number here];

它将起作用,只要"任何数字"足够大,可以包含整个字符串。如果您在边界之外写作,则行为是不确定的。

每当我尝试以以下形式进行输入时,它会崩溃:

char* temp;
cin >> temp;

流提取操作员要求传递给它的char*必须指向一个足够大以包含用户输入的数组。您忘了初始化temp,因此不满足要求。结果,程序的行为是不确定的。解决方案:分配一些内存并初始化temp以指向该内存。

同一错误发生了构造函数Strcpy(char*)。您不初始化this->wrd,而是将其解释。因此,行为是不确定的。解决方案与上述相同。

如果我理解正确的话

我想避免使用朋友功能,但是超载的操作员 需要两个参数,如果它仍然是班级成员。

您的声明是错误的。

类别中的二进制 运算符样本:

#include <iostream>
class Int {
  private: int _i;
  public:
    Int(int i = 0): _i(i) { }
    Int operator + (const Int &i) const
    {
      return Int(_i + i._i);
    }
    int get() const { return _i; }
};
int main(int, char**)
{
  Int i1(1), i2(2);
  Int i;
  i = i1 + i2;
  std::cout << "i: " << i.get() << std::endl;
  return 0;
}

在Cygwin上用GCC进行了编译并测试:

$ g++ -o test-op-plus test-op-plus.cc
$ ./test-op-plus.exe 
i: 3