Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).
Здравствуйте, WK, Вы писали:
WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).
Здравствуйте, 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).
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, WK, Вы писали:
WK>Чем можно объяснить применение функции-члена класса string c_str() для преобразования переменной типа string в char*? Ведь для этого можно было определить оператор преобразования типов (operator char*() { return переменная типа char*; }).
АТ> В данном случае это может представлять серьезную опасность, т.к. результат прпреобразования типа 'std::string' к обычной нуль-терминаторной строке живет далеко не вечно.
Можно ли привести какой-нибудь пример. ЗЫ только не относительно неявного преобразования, а времени жизни нуль-терминаторной строки.
Здравствуйте, 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' больше пользоваться нельзя
Здравствуйте, 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асколько проще была бы жизнь, если бы она была в исходниках.