2014-11-15 4 views
0

p1 и p2 указывают на одно и то же содержимое строки, следующие коды сравнивают их адреса, которые отличаются.Перегруппировка операторов класса строк

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* в качестве только аргумент, который говорит, что компилятор преобразоватьconst char* в строку, когда это возможно:

string (const char* s); 

Почему не преобразует компилятор p2 во временную строковую переменную, а затем сравнивает его с p1 с использованием оператора, определенного в строковом классе:

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

ответ

2

Это потому, что C++ может сравнить два const char* переменной p1 и p2 (другими словами, p1==p2 является допустимым C++ заявление без каких-либо для преобразования строки), а семантика видеть, являются ли они тот же физический адрес или нет (в вашем примере их нет, и поэтому возвращается false).

1

Компилятор не называет это operator== перегрузкой, потому что он не может - разрешение перегрузки для операторов срабатывает только в том случае, если хотя бы один из типов в выражении имеет класс или тип перечисления.

От C++ 11 проекта n3290 §13.3.1.2 Оператор выражения:

Если не операнд оператора в выражении не имеет тип, класс или перечисление, предполагается, что оператор быть встроенным оператор и интерпретироваться в соответствии с пунктом 5.

(а раздел 5 определяет == в разделе §5.10, с обычной семантикой сравнения указателя между прочим.)

Так что перегрузка даже не рассматривается. Вы просто не можете перегружать операторов только встроенными типами.

Смежные вопросы