字符串类关系运算符重载

时间:2014-11-15 15:49:44

标签: c++ operator-overloading

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

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

但是当我根据p2构建字符串变量时,比较p1和字符串变量会产生1而不是0

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

我的问题是:字符串类的构造函数将const char*作为唯一参数,告诉编译器转换 a {{1}在可能的情况下串起来:

const char*

为什么编译器不会将string (const char* s); 转换为临时字符串变量,然后使用字符串类中定义的运算符将其与p2进行比较:

p1

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

编译器不会调用operator==重载,因为它不能 - 如果表达式中至少有一个类型具有类或枚举类型,则操作符的重载解析只会启动。

来自C ++ 11 draftn3290§13.3.1.2运算符表达式

  

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

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

因此甚至没有考虑过载。你只是不能仅在内置类型上重载运算符。