![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Всё зависит от того проинициализированна ли глобальная переменная или нет.
Здесь нет инициализации (и не вызывается конструктор - это не объект). В этом случае в переменной мусор. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Gunslinger |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Синтаксис похож на конструктор у пользовательских объектов. Это случайность или у встроенных типов все же есть конструкторы? |
||||
|
|||||
artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Это просто фича такая есть в С++. Но конструкторов у базовых типов НЕТ. Добавлено через 10 минут и 15 секунд
В этом случае, компилеру просто говорится, что переданную по ссылке переменную name нельзя изменять в функции (конструкторе). Тем не менее, можно содержимое переменной скопировать во временную переменную и "баловаться" с ней. Благодаря тому, что переменная передаётся по ссылке, ускоряется вызов функции, а также рационально используется память. И в то же время, использование спецификатора const, гарантирует, что содержимое переменной не будет изменено внутри функции. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Значит, если мы объявляем переменную константой, то необходимо сразу определить ее иначе в ней останется мусор, который компилятор потом не позволит изменить? Возможности отложенного определения для константных переменных нет?
Не пойму тогда смысл этого кода: попытка положить в константную переменную значение. И Мейерс не пишет, что такой код вызывает ошибку. |
|||
|
||||
mes |
|
||||||||||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
то это только объявление - переменной в этом месте не создается, а следовательно некорректно говорить о том что в ней лежит..
это определение - создание переменной. явной инициализации тут нет, а неявная зависит от того где переменная определена.
определение с инициализацией. инициализация бывает не только посредством конструктора.
естественно не одно и то же..
не понял откуда такое вытекает... А Вы считаете что если у аргумента const & , то определенная ниже переменная должна быть константой ? Аргумент эта шишка которая упала на голову мишке, а переменная это шишка выросшая на лбу. Одна провоцируют другую , но даже если они схожи по виду и названию, они не являются одним и тем же ![]() |
||||||||||||||||
|
|||||||||||||||||
artsb |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
компилер будет ругаться если не проинициализировать константу.
нет. точнее отложенной инициализации нет.
Это сообщение отредактировал(а) artsb - 30.12.2009, 19:14 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||||
|
|||||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
да.
возможностей то у c++ много. можно изменить константу например воспользовавшись const_cast'ом.. но все это из разряда хаков. Так что на данном для Вас этапе лучше просто принять, что константа не изменяема. |
||||
|
|||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
сейчас проверил на BCB 6. даже не компилится. Добавлено @ 19:16 Пишет: "constant variable must be initialized" Это сообщение отредактировал(а) artsb - 30.12.2009, 19:17 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
константая переменная это const string& name ? Ну так эта аргументы создаются в момент вызова функции, и инициализируются переданными в функцию параметрами.. Не говоря о том, что там не константная переменная, а константная ссылка.. Добавлено через 9 минут и 31 секунду Когда в говорят в c++ что нельзя изменить значение переменной, означает что нельзя посрестством этой переменной изменить значение.. т.е. вот функция
принимает два аргумента по ссылке, причем первый по константной. исходя из этого делаем заключение, что внутри функции ci не может измениться, однако изменение самого значения которое хранит ci возможно :
![]() |
||||||
|
|||||||
Gunslinger |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
о_О? Вы имели ввиду: константная ссылка==ссылка на константу? Или аналогия с указателями неприменима? К подобному коду во всех учебниках говорится, что изменить такой объект нельзя.
То есть получается вроде:
? Это сообщение отредактировал(а) Gunslinger - 30.12.2009, 22:30 |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Параметр - то что передаем, а аргумент , то что получает функция две стороны одной медали ![]() угу.. ссылка на константу в полном смысле этого слова не применима, так как указатель самостоятельный объект и сам может быть константой.
плохо книги смотрели.. ![]() Изменить объект нельзя когда он изначально задается как константный и может быть размещен в рид-онли мемори. тут же мы один и тот же неконстантный объект передаем один раз посредством ссылки на константу, другой - посредством простой ссылки. то есть у нас получается два интерфейса к одному и тому же участку памяти : один read-only, другой read-write. Это сообщение отредактировал(а) mes - 30.12.2009, 22:56 |
|||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
С наступающим новым 2010м годом!
А теперь к скучному ![]() О_О. Прямо утро откровений. Тогда: Тип Параметра=Аргумент ![]() Какой тогда смысл писать const к аргументу-ссылке, если константность объекта определяется в объявлении вызывающей программы? Если переменная не должна быть изменена в функции, то необходимо сделать ее константной в вызывающей программе? Или не обязательно - можно сделать константной функцию, куда передаются ссылки? |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
смысл в том, что функции не важно каким он объявлен в главной программе, но внутри функции он должен себя вести как ссылка на константу. Одно из правил структурного программирования - возможность не держать все в голове, а делить на независимые составляющие. Деление на функции это один из шагов к этому. Добавлено @ 12:40 ![]() как можно приравнять тип к значению ?! и у аргумента и у параметра есть свой тип, кстати они могут быть не одинаковыми, тогда происходит преобразование (если возможно или ошибка в противном).
Это сообщение отредактировал(а) mes - 31.12.2009, 12:41 |
||||
|
|||||
Gunslinger |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Забыл поменять местами, извиняюсь ![]()
Стоп!!
Это похоже на создание временного объекта и привязки к нему ссылки! Блин, не научусь читать код... Временный объект создается в стеке функции или вызывающей? Если смотреть только на семантику (не смотреть, что это передача в функцию), то в стеке функции...
Ну так и получается, что раз ссылка константная, то внешний объект изменить нельзя, пусть он и объявлен без cоnst... Это сообщение отредактировал(а) Gunslinger - 31.12.2009, 13:55 |
||||||||
|
|||||||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
насколько я вижу, перемена слов того выражения не приближает к сути..
Давайте для начала уточним, что такое для Вас конструктор, и чем он отличается от функции. опять Вы не в ту сторону смотрите.. Не важно в чьем стеке, важно время жизни. Это как раз к разговору о том чем отличается блок функции от функционального блока. первое - это блок который включает все тело функции, а второе это любой блок. То есть блок функции может состоять из одного или множества включенных друг в друга функциональных блоков. У функции один стек, однако время жизни переменных может сильно разниться
к моменту создания i3, i2 будет уже уничтожена,а i1 удалится только после i3;
в этом примере : http://forum.vingrad.ru/index.php?showtopi...t&p=2061027 значение объекта переданного по ссылке на константу (хотя и косвенно, но) меняется .. Имхо Вы пытаетесь копнуть поглубже, чтоб найти истину, не разобравшись с тем что лежит на поверхности.. Это основная ошибка, потому что вся суть лежит на поверхности, а в глубине лишь подробности, с которыми нельзя будет разобраться не понимая основ. ![]() |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |