字符串类关系运算符重载

string class relational operator overload

本文关键字:重载 运算符 关系 字符串      更新时间:2023-10-16

p1p2指向相同的字符串内容,以下代码比较了它们不同的地址。

const char *p1 = "abc";
const char p2[] = {'a', 'b', 'c', ''};
cout << (p1 == p2) << endl;                   // 0  (false)

但是当我基于 p2 构造一个字符串变量时,比较p1和字符串变量会产生1而不是0

string s1(p2);
cout << (p1 == s1) << endl;                  //  1  (true)

我的问题是:字符串类具有将const char*作为其唯一参数的构造函数,它告诉编译器在可能的情况下将const char*转换为字符串:

string (const char* s);

为什么编译器不将p2转换为临时字符串变量,然后使用字符串类中定义的运算符将其与p1进行比较:

bool operator== (const char*   lhs, const string& rhs);

这是因为 c++ 可以比较两个变量const char*变量p1p2(换句话说,p1==p2 是一个有效的 c++ 语句,没有任何字符串转换),语义是查看它们是否是相同的物理地址(在您的示例中,它们不是,因此返回false)。

编译器

不会将其调用operator==重载,因为它不能 - 仅当表达式中至少有一个类型具有类或枚举类型时,运算符的重载解析才会启动。

从 C++11 草案 n3290 §13.3.1.2 运算符表达式

如果表达式中运算符的操作数没有类型是类或枚举,则假定该运算符是内置运算符,并根据子句 5 进行解释。

(第 5 条在第 §5.10 节中定义了==,其中包括通常的指针比较语义。

因此甚至不考虑过载。您根本无法仅在内置类型上重载运算符。