27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
||||||
1 | ||||||
string, c_str06.07.2012, 17:52. Показов 51625. Ответов 35
Метки нет (Все метки)
функция string.c_str() возвращает const char*, что бы не изменяли строку напрямую. Но! Если явно преобразовать указатель к char*, то строка вполне изменяется.
Угадайте что выведет. Так вот, собственно вопрос: зачем столько шумихи вокруг инкапсуляции, если даже в стринге ее легко обойти?
0
|
06.07.2012, 17:52 | |
Ответы с готовыми решениями:
35
Буффер из std::string c_str() Безопасность передачи string.c_str() в качестве параметра Не работает преобразование с c_str() X=atof(s.c_str()); - ошибка в Builder10 |
06.07.2012, 18:01 | 2 |
В каком месте тут обход инкапсуляции?
Если ты изменил строку таким образом, это еще не о чем не говорит. c_str() возвращает указатель на const char не для того, чтобы эту строку не меняли, а потому что она может вернуть указатель на копию строки. Т.е. где-то в памяти выделяется место, там формируется массив char'ов, содержащий строку, и возвращается указатель на этот участок памяти. Твои изменения строки могут быть бесмысленными, поэтому и const*.
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
06.07.2012, 18:09 [ТС] | 3 |
Kastaneda, обход в том, что я напрямую меняю то, что должно быть по идее скрыто.
0
|
06.07.2012, 18:19 | 4 |
Ну на то он и С++
В С++ можно обойти все, что угодно. Просто предполагается, что ты не должен этого делать. В других языках например до private полей недотянешся. Но смысл инкапсуляции не столько в том, что ты не должен чего то менять, а в том, что тебе нужны только public поля / методы и все, что не в public тебя не должно интересовать. Т.е. ты открываешь файл с каким то классом и смотришь, что у него в public'е. Ты видишь только то, что должен видеть. Поэтому кстати хороший стиль программирования - это делать public блок выше private. Все, что в private нужно для реализации функционала класса, оно тебя не волнует. На самом деле я сомневаюсь, что внес ясность) Подобные вещи сложно объяснить, понимание приходит с опытом.
1
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
06.07.2012, 18:23 [ТС] | 5 |
Kastaneda, ну почему же, теперь я вполне понимаю, зачем нужна инкапсуляция. Раньше я думал, что это для того, что бы напрямую нельзя было менять значения.
0
|
06.07.2012, 18:35 | 7 |
Зависит от реализации. У меня например код из первого поста работает, значит в моих компиляторах c_str() возвращает указатель на реальную строку.
Не по теме: Сейчас попробую найти ссылку, где я прочитал про то, что c_str() не всегда возвращает указатель на строку.
0
|
06.07.2012, 18:38 | 8 | ||||||||||
У меня тоже...
Ещё момент, который поставил меня в тупик:
12345 abcdef А если меняю первую строку на что-нибудь вроде:
abcdef abcdef Не понимаю логику... c_str() работает как захочет?
0
|
06.07.2012, 18:57 | 9 |
У меня в студии в слубом случае это выводит.
Нет, реализации std::basic_string<...> может отличаться от компилятора к компилятору. Поэтому нет гарантии, как должна рабатать std::string. Вот из стандарта
1
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
06.07.2012, 19:06 [ТС] | 10 |
Schizorb, так это же указатели. Они в любом случае указывают на один и тот же массив, следовательно и выводится одно и то же
1
|
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
|
|
06.07.2012, 19:37 | 12 |
я где-то читал что c_str() содает новый массив, потому что данный которые в стринге в памяти находятся не друг за другом, тоесть если первый элемент находится по адресу 0xffee12 то не гарантируется что второй находится по адресу 0xffee13
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
06.07.2012, 19:37 | 13 |
aram_gyumri, В стандарте С++11 гарантируется, ранее это не гарантировалось, однако не видел я реализации хранения в отдельных кусках.
1
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
06.07.2012, 19:39 [ТС] | 14 |
aram_gyumri, то есть стринг - односвязный список? О_о
0
|
06.07.2012, 19:41 | 16 |
Чисто на всякий случай: Функции класса в разделе private реализуются так же как и в разделе public?
Просто надо понимать, что любая защита в контексте языка Си++ - это защита от собственных ошибок, а не от хакера
0
|
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
|
|
06.07.2012, 19:42 | 17 |
я просто написал что читал), а вообще меня неволнует что там делает стринг я больше char * предпочетаю
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
06.07.2012, 19:51 | 19 |
diagon, Ну не всегда даже это private гарантирует
0
|
Higher
|
|
06.07.2012, 19:53 | 20 |
0
|
06.07.2012, 19:53 | |
06.07.2012, 19:53 | |
Помогаю со студенческими работами здесь
20
Очень медленное выполнение .c_str() в minGW Visual c++ input().c_str() вводит мусор реализация функции c_str() в моем классе Str c_str() или моя голова провалилась в пропасть Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |