重载类函数中的按位和 (&) 运算符和"*this"
Overloading Bitwise And(&) Operator and "*this" in Class Functions
我对这段特定的代码有几个问题。我首先应该提到的是,pChar
将始终是一个动态字符数组,当我没有列出的方法需要时,它会调整大小。我已经搜索了我的参考手册和这个网站,但似乎无法清楚地了解&操作员全面工作。我也不想使用替代方案,因为这是一项任务,不允许这样做。我已经做了好几天了,如果有任何帮助,我将不胜感激。
-
CCD_ 2在使用&操作人员我一直假设它指向左操作数。
-
如果不是这样,我如何访问&运算符方法?
-
如果这一切都是完全不正确的,我如何使用过载的
operator&
来达到预期的结果?
用于&操作员:
PDS_String & PDS_String::operator & (const PDS_String & Str)const
{
PDS_String temp(*this);
strcat(temp.pChar, Str.pChar);
return temp;
}
Main:
void main ()
{
PDS_String String1;
PDS_String String2;
PDS_String String3;
String1 = "monkey";
String2 = "chicken";
String3 = String1 & String2;
// Desired outcome for String3 is "monkeychicken"
}
类别:
class PDS_String
{
public:
PDS_String(); //Default
PDS_String(const PDS_String &); //Copy
~PDS_String(); //Destructor
char * operator & (const PDS_String &) const; // Concatenation
PDS_String & operator = (const char *); // Assignment
// I haven't listed all methods and operator overloads
private:
char * pChar;
long NumChars;
long NumSlots;
};
赋值运算符方法:
PDS_String & PDS_String::operator = (const char * Str)
{
if (pChar == Str)
return *this;
else
{
if (NumSlots < strlen(Str))
{
delete[] pChar;
pChar = new char[(strlen(Str) + 1)];
NumSlots = (strlen(Str));
}
else;
}
strcpy(pChar, Str);
NumChars = strlen(Str);
return *this;
}
非常感谢马特·麦克纳布。我已经换了话务员&反映您建议的方法:
char * PDS_String::operator & (const PDS_String & Str)const
{
char * temp;
temp = new char[strlen(pChar)+strlen(Str.pChar)+1];
temp = pChar;
strcat(pChar, Str.pChar);
return temp;
}
-
*this
表示左侧操作数。this
指向左侧操作数。 -
无
-
停止返回对本地对象的引用。当函数结束时,
temp
就不存在了,所以调用者有一个悬空引用(导致未定义的行为(。
二进制运算符的正常语义是按值返回对象。所以你可以换成PDS_String PDS_String::operator & (const PDS_String & Str)const
,一切都会好起来的。
通常所做的是,operator+=
函数是一个更改*this
的成员函数,然后您就有了一个自由函数X operator+(X x1, X x2) { return x1 += x2; }
。你可以用operator&
和operator&=
做同样的事情。
您也无法防止有人试图连接一个长字符串并溢出。无论pChar
分配了多少内存,您都需要为此添加检查。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 如何通过派生类函数更改基类中的向量
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 在类函数中初始化外部作用域变量
- c++ 在非类函数中使用类变量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 从类成员函数到类 C 函数指针的转换
- 如何在模板类函数中分配结构值?
- 有没有办法将重载的类函数绑定到函数对象?
- 启动类函数作为失去引用的线程
- C++调用使用重写函数的父类函数
- 将值传递到另一个类函数在打印时为零
- 计算对类函数的所有调用次数
- 由于签名差异,调用了错误的子类函数
- 删除复制构造函数和运算符=类范围访问
- 将部分指定的模板化矩阵乘法运算符重载函数声明为类外的友元
- 模板类友元运算符成员函数
- 重载类函数运算符兼任二传手和吸气手
- C++ 重载函数运算符和继承,无法在子类函数中正确使用它
- 重载类函数中的按位和 (&) 运算符和"*this"