c++-faq - C++ struct operator - 操作符重载的基本规则和习惯用语是什么?

operator overloading是什么 / c++ / operators / operator-overloading

注意:答案是按特定顺序给出的,但是由于许多用户是根据投票而不是给出时间来对答案进行排序的,因此以下是最有意义的顺序的索引

Community



Answer #1

下面是一个带有隐式转换操作符的简单类。

class my_string {
public:
  operator const char*() const {return data_;} //这是转换运算符
private:
  const char* data_;
};

隐式转换操作符,像单参数构造函数一样,是用户定义的转换。编译器在试图匹配对一个重载函数的调用时,会授予一个用户定义的转换。

void f(const char*);

my_string str;
f(str); //与f(str.operator const char *())相同
void f(my_string&);
void f(const char*);

f(my_string());

与隐式转换操作符不同,显式转换操作符永远不会在你不期望的情况下启动。下面是一个带有显式转换操作符的简单类。

class my_string {
public:
  explicit operator const char*() const {return data_;}
private:
  const char* data_;
};

要调用显式 static_cast 运算符,必​​须使用static_cast,C样式强制转换或构造函数样式强制转换(即 T(value) )。

但是,有一个例外:允许编译器隐式转换为 bool 。另外,编译器在转换为 bool 之后,不允许进行其他隐式转换(编译器一次只能进行2次隐式转换,但最多只能进行1个用户定义的转换)。