赋值运算符通过指针访问时不会调用重载

时间:2018-01-17 09:54:28

标签: c++ overloading operator-keyword

我在C ++中有关于运算符重载的问题,请考虑以下类

CharacterString.h文件

class CharacterString {
 private:
   char* __charString;
 public:
   CharacterString();
   ~CharacterString();

void operator =(const char* sFileName);
};

// CharactorString.cpp文件

CharacterString::CharacterString() { }

CharacterString::~CharacterString() { }


void CharacterString::operator=(const char* sFileName) 
{
   this->__charString = (char *)sFileName;
}

在main函数中,以下代码可以正常工作。

CharacterString fileName;

fileName = "Hello, World";

但是,引起的波纹管代码显示编译器错误

CharacterString* fileName;

fileName = new CharacterString();
fileName = "Hello, World";
printf("%s", fileName);

enter image description here

1 个答案:

答案 0 :(得分:2)

如果将fileName声明为指针:

CharacterString* fileName;

然后,如果要访问该对象,必须先使用*或 - >取消引用它。这样:

*fileName = "Hello, World";
fileName->operator=("Hello, World");

printf()调用完全不正确,它只是偶然起作用(因为CharacterString对象以与char *相同的二进制格式放在堆栈上。您应该为string添加getter方法:

class CharacterString {
private:
  char* __charString;
public:
  CharacterString();
  ~CharacterString();
  char *getString() { return __charString; }
  void operator =(const char* sFileName);

};

然后你可以写:

printf("%s", fileName->getString());

尝试制作,例如~CharacterString()虚拟更改对象的二进制表示,并在没有getString()的情况下立即停止工作。

最后一个(非主题),请注意以下划线开头的符号是保留的,不应在"用户代码"中使用。