Nafanya Когда закончишь школу и попробуешь свой "профессионализм" в команде, поймешь о чем я говорю. Представь себе, что ты написал функцию, и она принимает параметр по константной ссылке или указателю на константу. Ты отдаешь эту функцию коллеге. Он будет ее где-то как-то вызывать. Можно ли внутри этой функции отменять константность через const_cast? Вот это и зависит от того, каким образом была объявлена та сущность, ссылку или указатель на которую тебе передали. Пока твое "по программировать" заключается в написании поделочек вроде "угадывание числа", введенного в stdin, то конечно же, проблема будет казаться надуманной. Однако, после вступления во взрослую жизнь, многие вещи станут более понятными.
Booster Это все экспрессия const_cast - неотъемлимая часть языка, законный оператор, подчиняющийся определенным правилам.
вся надежда когда переписываеш код через какое то время на const в параметрах функции сразу ясно как поменять если кто то будет тайком менять параметр объявленный const это ахтунг еще VS const помещает в PAGE_READONLY снимаеш константность и падаеш с access violation
кстати про трудоустройство: http://www.coolinterview.com/type.asp?iType=444 возможные вопросы интервью при трудоустройстве к мелкомягким, для сравнения) ЗЫ ни разу не использовал const_cast... полет нормальный... зачем инициализировать класс, если он здесь никоим образом не нужен?
_DEN_ 6 лет назад закончил. Кстати прикольные были годы... Но в универе как-то интересней было учиться... Ага, мы на лабах пять лет угадывали число, вводимое юзером с клавиатуры, используя современные методы теорвера и статистического анализа, а наши исследования в этой области курировали профессора и доценты. Под конец я написал на это тему выпускную дипломную работу Дитё, когда ты угомонишься наконец?
Интересный код: Код (Text): #include <iostream> using namespace std; #define DF(N) void N() { \ cout << "function " #N " called..." << endl; } DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g); void (*func_table[])() = { a, b, c, d, e, f, g }; int main() { while(1) { cout << "press a key from 'a' to 'g' " "or q to quit" << endl; char c, cr; cin.get(c); cin.get(cr); // second one for CR if ( c == 'q' ) break; // ... out of while(1) if ( c < 'a' || c > 'g' ) continue; (*func_table[c - 'a'])(); } }
вот в ту же тему: Код (Text): #define FUNC2(x,y) x##y #define FUNC1(x,y) FUNC2(x,y) #define FUNC(x) FUNC1(x,__COUNTER__) int FUNC(my_unique_prefix); int FUNC(my_unique_prefix);
Booster Пользователь через терминал осуществляет выбор вызываемой функции. Функции сжато определены с использованием макросов. Rel Вы не могли бы привести пример простого make-файла для студии. Что-то там какой-то у них формат особенный. Думаю попробовать собрать проект используя makefile с зависимостями, как рекомендует автор книги. Кстати синтаксис make-файлов, описанный в книге, студия не понимает - для Линухи походу. (Ни разу так не делал, всегда все автоматом собирал).
Booster Да... смешная шутка. Это Вы так согласились, что без const_cast там не обойтись или просто не поняли, что wstring там только для упрощения примера в виде предопредлённого значения? А на самом деле вполне может быть аргументом функции. И, скажем, дальше по коду требуется из него выделять substr, а потом сравнивать с какой-нибудь другой строкой... короче, нужен wstring и без него никак. Итак, как в таком случае избавиться от const_cast?
Код (Text): const char* constString = "What the fuck!"; char* String = (char*)constString; printf("%s\n", String); Код (Text): const char* constString = "What the fuck!"; const char* subStr = "the"; char Buf[256]; memset(Buf, 0, 256); strstr(constString, subStr); if(subStr) { memcpy(Buf, subStr, strlen(subStr)); } printf("%s\n", Buf); будьте проще))) если объект передается по константной ссылке, то может быть и не обойтись... а тут не зачем, мне кажется)
Rel Зачастую "простота - хуже воровства". Особенно, если речь идёт о серьёзном проекте, а не какой-нибудь утилитке.