c_str()
От: WK  
Дата: 26.04.03 20:38
Оценка:
Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).
Re: c_str()
От: Igor Soukhov  
Дата: 26.04.03 20:57
Оценка:
Здравствуйте, WK, Вы писали:

WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).


c_str выдает указатель на константу.
* thriving in a production environment *
Re: c_str()
От: Андрей Тарасевич Беларусь  
Дата: 26.04.03 21:24
Оценка:
Здравствуйте, WK, Вы писали:

WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).


Приведения типов, сделанные при помощи переопределенных операторов, выполняются неявно, а следовательно, могут оказаться выполненными по ошибке. В данном случае это может представлять серьезную опасность, т.к. результат прпреобразования типа 'std::string' к обычной нуль-терминаторной строке живет далеко не вечно. Вот поэтому и сделали явную функцию, чтобы пользователь понимал, что делает и каким опасностям подвергается.
Best regards,
Андрей Тарасевич
Re: c_str()
От: Аноним  
Дата: 26.04.03 21:24
Оценка:
Здравствуйте, WK, Вы писали:

WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator const char*() { return переменная типа const char*; }).


Наличие оператора приведения типов привело бы к неочевидностям и двусмысленностям в интерпретации многих языковых конструкций (что, собственно, наблюдаем при использовании CString от MFC).
Re[2]: c_str()
От: WK  
Дата: 27.04.03 11:21
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, WK, Вы писали:


WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).


АТ> В данном случае это может представлять серьезную опасность, т.к. результат прпреобразования типа 'std::string' к обычной нуль-терминаторной строке живет далеко не вечно.


Можно ли привести какой-нибудь пример. ЗЫ только не относительно неявного преобразования, а времени жизни нуль-терминаторной строки.
Re[3]: c_str()
От: Андрей Тарасевич Беларусь  
Дата: 27.04.03 14:11
Оценка:
Здравствуйте, WK, Вы писали:

WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).


АТ> В данном случае это может представлять серьезную опасность, т.к. результат прпреобразования типа 'std::string' к обычной нуль-терминаторной строке живет далеко не вечно.


WK>Можно ли привести какой-нибудь пример. ЗЫ только не относительно неявного преобразования, а времени жизни нуль-терминаторной строки.


Согласно стандарту языка, вызов любого неконстантного метода класса 'std::string' приводит к тому, что указатель, возвращенный до этого методом 'c_str()' более не является корректным.

std::string str = "abcdef";

const char* lpsz = str.c_str();
// Содержимым указателя 'lpsz' можно пользоваться до тех пор пока не вызван какой-нибудь неконстантный метод объекта 'str'

str[0] = "A";
// Текущим содержимым указателя 'lpsz' больше пользоваться нельзя
Best regards,
Андрей Тарасевич
Re: c_str()
От: Sergeem Израиль  
Дата: 28.04.03 07:56
Оценка: 6 (2)
Здравствуйте, WK, Вы писали:

WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).


Чтобы не было путаницы. Рекомендую почитать книжки Саттера "Exceptional C++" и "More exceptional C++".
Например, вот что какие трудновыловимые ошибки получаются, если бы string имел неявный оп. преобразования:

string s1 = ...;
string s2 = ...;

string s = s1 - s2; // имелся ввиду конечно же +

...

string s = s1 + 1; // на самом деле хотели написать + "1"
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.