超载 运算符在C 中加入两个字符串(一些疑问)
Overloading + operator to concatenate two strings in C++ (Some doubts)
我几天前才开始学习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
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 两个字符串之间的数学运算
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 给定两个字符串 S 和 T.确定与 T 相差最小的 S 子字符串?
- gtest:检查字符串是否等于两个字符串之一
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 我可以在系统()中使用两个字符串吗?