![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Читаю в книге пример инициализации статического компонента класса
И вот часть где идет присваивание NULL я никак не могу догнать. Я бы понял такую запись:
Хоть и не знаю на сколько она правильная. Можете мне разъяснить где тут что к чему относится ? |
||||
|
|||||
| DjoNIK |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Первый вариант правильный, и второй тоже (может быть в каком-нибудь другом языке, но не в C++)
Всё очень просто:
говоришь компилятору о том, что инициализируемая переменная будет указателем на list;
говоришь о том, что эта переменная будет членом класса list;
собственно задаешь значение переменной. PS: Что за книгу читаешь? Это сообщение отредактировал(а) DjoNIK - 19.8.2007, 19:20 -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
||||||
|
|||||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Книжка "Язык С++ В.В. Подбельский 4 издание 1999г.".
Без явного указания типа компилятор ругается:
Это фича такая чтоль или gcc тупит и не может определить тип без явного указания ? Это сообщение отредактировал(а) SABROG - 19.8.2007, 20:02 |
|||
|
||||
| DjoNIK |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Ты правильно понял!
Действительно, компилятор знает, что у его переменной-члена тип "list *". НО(!) откуда ты думаешь, что компилятор узнает какой именно член класса ты инициализируешь? А ведь для этого и нужно указать тип(переменная-член)/тип возвращаемого значения(функция-член класса), название класса, поставить двоеточие, указать имя переменной-члена/функции-члена класса и задать значение если это переменная. -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
||||
|
|||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
| DjoNIK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Судя по твоим вопросам, ты не совсем правильно понимаешьсути происходящего. Я сам только начинаю путешествие в этот волшебный мир программирования
-------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Ну как же. Если компилятор не позволяет иметь в одном контексте переменную и функцию с одним и тем же именем, а значит по имени четко можно определить переменная это или метод.
Вот что будет если завести метод и переменную с одним именем:
|
|||
|
||||
| DjoNIK |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Вообще-то да, в данном случае не с кем. Но если учесть, что человек будет иметь дело с функциями(о чем ты и говоришь), то здесь тип нужно указать. Но ведь и по семантике одновременного объявления и определения в C++ положено так:
при условии, что ИДЕНТИФИКАТОР_ПЕРЕМЕННОЙ для членов класса содержит и идентификатор самого класса с разрешением зоны видимости (::). Или я не прав? -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
||||
|
|||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
SABROG, привила есть правила. По правилам языка Си, если ты написал:
Статическая переменная класса в C++ это тоже в некотором роде extern. Только оформлен он немного подругому. А extern - это не объявление переменной. А декларация того, что она где-то определена. Определение это как раз и есть твой:
Это сообщение отредактировал(а) bsa - 19.8.2007, 20:20 |
||||||
|
|||||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Ну если больше аргументов нет, то я могу сделать вывод, что это недоработка стандарта, т.к. реальной пользы от соблюдения этого правила нет, только путаница.
|
|||
|
||||
| DjoNIK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Весьма сомнительное заявление, т.к. для разбора входной цепочки символов (т.е. исходного файла) используются весьма сложные алгаритмы. Если убрать из стандарта и эту формализацию правил семантики, то они(алгоритмы) станут ещё сложнее, следовательно время компиляции вырастет. К тому же не так уж и сложно написать пару лишних символов. Опять же IMHO. Это сообщение отредактировал(а) DjoNIK - 19.8.2007, 20:32 -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
И все же, мне кажется, дело вовсе не в скорости, т.к. везде и повсеместно тип переменных опускается после первого определения. Или вот я не могу понять почему необходимо писать прототипы функций/определения, если их прототипы дублируются в реализации:
Т.е. информации достаточно, чтобы 1) соотнести метод к конкретному классу 2) выцепить типы параметров Хотя может я и упускаю, какие-нибудь исключительные ситуации. |
|||
|
||||
| DjoNIK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Кстати да! Но ты не забывай, что определение класса - не одно и то же, что определение объекта класса!!! При определение класса ты как бы сообщаешь компилятору скелет будующих объектов, но ПАМЯТЬ при этом НЕ ВЫДЕЛЯЕТСЯ. В противовес этому определение объекта выделяет память под уже известный каркас(наш класс). Но если ты определишь объект класса, но забудешь определить статический член класса, то этот член будет содержать случайное значение(в случае объявления локальным) или ноль(если объект глобален). -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Да, только на эту ситуацию наличие или отсутствие типа статического члена класса, за пределами этого класса никак не влияет. Прописав явную инициализацию объекта, еще и указав какому классу он принадлежит компилятор знает чего и сколько вешать в граммах, причем на скорость компиляции это влияет в любом случае, т.к. происходит сравнение типов, я уже попробовал вместо int напсать unsigned int и получил ошибочку, т.е. компилятор в любом случае проверяет типы.
Это сообщение отредактировал(а) SABROG - 19.8.2007, 21:21 |
|||
|
||||
| DjoNIK |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
Само собой, но чем более формализована семантика языка, тем лучше для скорости компиляции(кажеться, что я повторяюсь Одно дело получить
и совсем другое
Ну если ты не согласен, то можно аргументировать и отослать в комитет стандартизации до 2009 года А вообще-то мы давно отошли от темы топика Господа! -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |