Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 110, средняя оценка - 4.68
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

string, c_str - C++

06.07.2012, 17:52. Просмотров 16510. Ответов 35
Метки нет (Все метки)

функция string.c_str() возвращает const char*, что бы не изменяли строку напрямую. Но! Если явно преобразовать указатель к char*, то строка вполне изменяется.

C++
1
2
3
4
5
6
7
8
9
10
int main()
{
        string str = "qwerty";
        char *p = (char*)str.c_str();
        *(p+1) = 'k';
        
        cout << str;
        getch();
        return 0;
}

Угадайте что выведет.

Так вот, собственно вопрос: зачем столько шумихи вокруг инкапсуляции, если даже в стринге ее легко обойти?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 17:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос string, c_str (C++):

Буффер из std::string c_str() - C++
Здравствуйте! такое дело: Проект на Qt5 и С++11. Есть форма с полем ввода. Введённое содержимое должно обработаться отдельным потоком...

Безопасность передачи string.c_str() в качестве параметра - C++
Есть некоторая функция которая принимает в себя си-строку, модифицирует ее (в т.ч. может увеличить количество данных). Безопасно ли...

Не работает преобразование с c_str() - C++
Доброго времени суток. Пытаюсь определить расширение найденного файла путем сравнения со строкой: if(NULL !=...

X=atof(s.c_str()); - ошибка в Builder10 - C++
Здравствуйте ! Помогите, пожалуйста, чайнику. Проблема такая: Создаю учебный проект простого калькулятора. Обработчик щелчка по...

Visual c++ input().c_str() вводит мусор - C++
Я создал стринг переменную, получил через getline cin значения, передал их в другой метод, спри этом сконвертировал в .c_str() но...

Очень медленное выполнение .c_str() в minGW - C++
Есть функция: sscanf(line.c_str(), &quot;%d\t%d\t%hu.%hu.%hu\t%hu:%hu:%hu\t%lf&quot;, &amp;tmpData.Pip, &amp;tmpData.Tm, &amp;tmpData.Year, &amp;tmpData.Mont,...

35
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,203
Записей в блоге: 27
06.07.2012, 19:41 #16
Чисто на всякий случай: функции класса раздела private реализуються так же как и раздела public? в смысле виртуальных функций, дружественных функций, и т.д.
Просто надо понимать, что любая защита в контексте языка Си++ - это защита от собственных ошибок, а не от хакера
0
dr.curse
389 / 345 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
06.07.2012, 19:42 #17
Цитата Сообщение от ForEveR Посмотреть сообщение
aram_gyumri, В стандарте С++11 гарантируется, ранее это не гарантировалось, однако не видел я реализации хранения в отдельных кусках.
я просто написал что читал), а вообще меня неволнует что там делает стринг я больше char * предпочетаю
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.07.2012, 19:50 #18
private запрещает использовать лишь имя переменной.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.07.2012, 19:51 #19
diagon, Ну не всегда даже это private гарантирует
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.07.2012, 19:53 #20
Цитата Сообщение от ForEveR Посмотреть сообщение
diagon, Ну не всегда даже это private гарантирует
А какие есть исключения(кроме использования внутри класса, разумеется)?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.07.2012, 19:59 #21
diagon, Специализация шаблонной функции объявленной в классе своим типом, все же не совсем внутри класса.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
06.07.2012, 20:06  [ТС] #22
Evg, ну то есть получается, что зря я храню характеристики персонажей в private?
Ведь проще напрямую взаимодействовать с переменными, чем через SetVal, GetVal
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
06.07.2012, 20:08 #23
Ksan, Инкапсуляция. Я вам крайне советую почитать Герба Саттера. В коде, не относящемся к реализации класса (иерархии), используя его нормально (не используя хаки со специализациями и доступ к членам через смещение), вы можете использовать только public интерфейс класса, до private данных вам не дотянуться.
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
06.07.2012, 22:45 #24
Evg, ну то есть получается, что зря я храню характеристики персонажей в private?
Ведь проще напрямую взаимодействовать с переменными, чем через SetVal, GetVal
Да, если не предусмотрено "последействия" - т.е вы меняете переменну А, а она вызывает еще автоматом изменение переменной B ну и в тех случаях когда "односторонний" доступ к переменной (например только для записи)
0
_or_75
-1 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 244
06.07.2012, 22:50 #25
а если так?

C++
1
2
3
4
5
6
7
8
9
int main()
{
        char *str = "qwerty";
        char *p = str.c_str();
        *(p+1) = 'k';
        cout << str;
        getch();
        return 0;
}
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,203
Записей в блоге: 27
07.07.2012, 00:29 #26
Цитата Сообщение от Ksan Посмотреть сообщение
Evg, ну то есть получается, что зря я храню характеристики персонажей в private?
Ведь проще напрямую взаимодействовать с переменными, чем через SetVal, GetVal
В маленьком проекте - проще. В большом проекте (особенно если над ним работает несколько человек) такой подход резко увеличивает вероятность того, что накосячишь на ровном месте, а потом концов не соберёшь. А потому лучше сразу приучать себя к тому, чтобы делать правильно

В функциях GetVal, SetVal ты всегда можешь поставить печать и быстренько посмотреть трассу изменения и чтения величины. Обращаясь к полю напрямую такого ты сделать не сможешь. Т.е. такой подход в том числе более удобен с точки зрения отладки
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
07.07.2012, 00:32 #27
Ну и еще такой фактор как рост, сейчас-просто, а завтра- все равно придется писать SetVal,GetVal ( например, если появится последействие )
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,203
Записей в блоге: 27
07.07.2012, 00:35 #28
Есть ещё и такое явление: чтобы понять, как делать правильно, нужно хорошо наступить на грабли тогда, когда делаешь неправильно. Тогда будешь намного более чётко понимать, а нафига делают так
2
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,951
Записей в блоге: 17
07.07.2012, 00:40 #29
Ну честно говоря это действительно не удобно и не особо читаемо.
Например в Builder-е попровлено это дело свойствами.Но опять таки это ведь надстройка IDE, а не язык...
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
07.07.2012, 00:49 #30
Avazart, Все удобно и все читаемо, свойства это исключительно синтаксический сахар в большинстве случаев.
0
07.07.2012, 00:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2012, 00:49
Привет! Вот еще темы с ответами:

реализация функции c_str() в моем классе Str - C++
Ребята, вот есть у меня в классе Str данные: private: Vec&lt;char&gt; data; char* buffer; В конструкторе я пишу: Str() :buffer(new...

c_str() или моя голова провалилась в пропасть - C++
Здравствуйте товарищи, один и тот же код приводит меня к правильному решению в 9 билдере, а вот в 10 мне выдает проблему: Unit1.cpp(94):...

Не могу заставить функцию str.c_str() коректно работать - C++
Доброго времени суток , мне нужно написать программу которая сравнивает введенную букву с словом(часть кода виселицы ) , нонепонятно почему...

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru