Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация, определение и конструкторы 
V
    Опции темы
artsb
Дата 30.12.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(Gunslinger @  30.12.2009,  09:40 Найти цитируемый пост)
то это только объявление - в переменной лежит мусор.

Всё зависит от того проинициализированна ли глобальная переменная или нет.

Цитата(Gunslinger @  30.12.2009,  09:40 Найти цитируемый пост)
это объявление и... неявная инициализация (конструктором int по умолчанию)?

Здесь нет инициализации (и не вызывается конструктор - это не объект). В этом случае в переменной мусор.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Gunslinger
Дата 30.12.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(artsb @  30.12.2009,  11:14 Найти цитируемый пост)
Здесь нет инициализации (и не вызывается конструктор - это не объект). В этом случае в переменной мусор.

Код

int f(5); //doble, float, char, string...

Синтаксис похож на конструктор у пользовательских объектов. Это случайность или у встроенных типов все же есть конструкторы?


PM MAIL   Вверх
artsb
Дата 30.12.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(Gunslinger @  30.12.2009,  17:11 Найти цитируемый пост)
Синтаксис похож на конструктор у пользовательских объектов. Это случайность или у встроенных типов все же есть конструкторы?

Это просто фича такая есть в С++. Но конструкторов у базовых типов НЕТ.

Добавлено через 10 минут и 15 секунд
Код

NameObject(const string& name, const& numb);

В этом случае, компилеру просто говорится, что переданную по ссылке переменную name нельзя изменять в функции (конструкторе). Тем не менее, можно содержимое переменной скопировать во временную переменную и "баловаться" с ней.
Благодаря тому, что переменная передаётся по ссылке, ускоряется вызов функции, а также рационально используется память. И в то же время, использование спецификатора const, гарантирует, что содержимое переменной не будет изменено внутри функции.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Gunslinger
Дата 30.12.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(artsb @  30.12.2009,  17:58 Найти цитируемый пост)
Но конструкторов у базовых типов НЕТ

Значит, если мы объявляем переменную константой, то необходимо сразу определить ее иначе в ней останется мусор, который компилятор потом не позволит изменить? Возможности отложенного определения для константных переменных нет?
Код

 NameObject(const string& name, const& numb);
...
NameObject no1("blablabla",2);

Не пойму тогда смысл этого кода: попытка положить в константную переменную значение. И Мейерс не пишет, что такой код вызывает ошибку.

PM MAIL   Вверх
mes
Дата 30.12.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  30.12.2009,  08:40 Найти цитируемый пост)
Код

extern int m;


то это только объявление - в переменной лежит мусор.

то это только объявление -  переменной в этом месте не создается,  а  следовательно некорректно говорить о том что в ней лежит..

Цитата(Gunslinger @  30.12.2009,  08:40 Найти цитируемый пост)
Код

int m;

это объявление и... неявная инициализация (конструктором int по умолчанию)?

это определение - создание переменной.  явной инициализации тут нет, а неявная зависит от того где переменная определена.

Цитата(Gunslinger @  30.12.2009,  08:40 Найти цитируемый пост)
Код

int m=4;
объявление и сразу инициализация - таком способе конструктор типа не вызывается. 

определение с инициализацией.  инициализация бывает не только посредством конструктора.



Цитата(Gunslinger @  30.12.2009,  08:40 Найти цитируемый пост)
Либо константный аргумент не тоже самое, что и константная переменная, 

естественно не одно и то же..

Цитата(Gunslinger @  30.12.2009,  08:40 Найти цитируемый пост)
либо константу дозволяется инициализировать позже, если она не инициализирована (но тогда неявной инициализации у string нет

не понял откуда такое вытекает...

А Вы считаете что если у аргумента const & , то определенная ниже переменная должна быть константой ?
Аргумент эта шишка которая упала на голову мишке, а переменная это шишка выросшая на лбу. Одна провоцируют другую , но даже если они схожи по виду и названию, они не являются одним и тем же smile











--------------------
PM MAIL WWW   Вверх
artsb
Дата 30.12.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(Gunslinger @  30.12.2009,  19:05 Найти цитируемый пост)
Значит, если мы объявляем переменную константой, то необходимо сразу определить ее иначе в ней останется мусор, который компилятор потом не позволит изменить?

компилер будет ругаться если не проинициализировать константу.

Цитата(Gunslinger @  30.12.2009,  19:05 Найти цитируемый пост)
Возможности отложенного определения для константных переменных нет?

нет. точнее отложенной инициализации нет.

Цитата(Gunslinger @  30.12.2009,  19:05 Найти цитируемый пост)
Не пойму тогда смысл этого кода: попытка положить в константную переменную значение. И Мейерс не пишет, что такой код вызывает ошибку.


Цитата(artsb @  30.12.2009,  17:58 Найти цитируемый пост)
В этом случае, компилеру просто говорится, что переданную по ссылке переменную name нельзя изменять в функции (конструкторе). Тем не менее, можно содержимое переменной скопировать во временную переменную и "баловаться" с ней.
Благодаря тому, что переменная передаётся по ссылке, ускоряется вызов функции, а также рационально используется память. И в то же время, использование спецификатора const, гарантирует, что содержимое переменной не будет изменено внутри функции. 



Это сообщение отредактировал(а) artsb - 30.12.2009, 19:14


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mes
Дата 30.12.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  30.12.2009,  18:05 Найти цитируемый пост)
Значит, если мы объявляем переменную константой, то необходимо сразу определить ее иначе в ней останется мусор, который компилятор потом не позволит изменить? 

да.

Цитата(Gunslinger @  30.12.2009,  18:05 Найти цитируемый пост)
возможности отложенного определения для константных переменных нет?

возможностей то у c++ много. можно изменить константу например воспользовавшись const_cast'ом.. но все это из разряда хаков.
Так что на данном для Вас этапе лучше просто принять, что константа не изменяема.


--------------------
PM MAIL WWW   Вверх
artsb
Дата 30.12.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Цитата(mes @  30.12.2009,  19:13 Найти цитируемый пост)
Цитата(Gunslinger @  30.12.2009,  18:05 Найти цитируемый пост)
Значит, если мы объявляем переменную константой, то необходимо сразу определить ее иначе в ней останется мусор, который компилятор потом не позволит изменить? 

да.

сейчас проверил на BCB 6. даже не компилится.

Добавлено @ 19:16
Пишет: "constant variable must be initialized"

Это сообщение отредактировал(а) artsb - 30.12.2009, 19:17


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mes
Дата 30.12.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  30.12.2009,  18:05 Найти цитируемый пост)
Не пойму тогда смысл этого кода: попытка положить в константную переменную значение.

константая переменная это const string& name ?
Ну так эта аргументы создаются в момент вызова функции, и инициализируются переданными в функцию параметрами..
Не говоря о том, что там не константная переменная, а константная ссылка..

Добавлено через 9 минут и 31 секунду
Когда в говорят в c++ что нельзя изменить значение переменной,
означает что нельзя посрестством этой переменной изменить значение..
т.е. вот функция
Код

void f (const int& ci, int& i)
{
    while (--i)
    std::cout << ci  << " ";
}

принимает два аргумента по ссылке, причем первый по константной.

исходя из этого делаем заключение, что внутри функции ci не может измениться,
однако изменение самого значения которое хранит ci возможно :
Код

int main()
{
   int j=3;
   f(j,j);
}

smile



--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 30.12.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  30.12.2009,  19:17 Найти цитируемый пост)
const string& name ... Не говоря о том, что там не константная переменная, а константная ссылка..

о_О? Вы имели ввиду: константная ссылка==ссылка на константу? Или аналогия с указателями неприменима? К подобному коду во всех учебниках говорится, что изменить такой объект нельзя. 

Цитата(mes @  30.12.2009,  19:17 Найти цитируемый пост)
Ну так эта аргументы создаются в момент вызова функции, и инициализируются переданными в функцию параметрами..

То есть получается вроде: 
Код

Тип Параметр_Функции=Аргумент //значение, адрес

?


Это сообщение отредактировал(а) Gunslinger - 30.12.2009, 22:30
PM MAIL   Вверх
mes
Дата 30.12.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  30.12.2009,  21:21 Найти цитируемый пост)

То есть получается вроде: 

Параметр - то что передаем, а аргумент , то что получает функция
две стороны одной медали smile

Цитата(Gunslinger @  30.12.2009,  21:21 Найти цитируемый пост)
константная ссылка==ссылка на константу? 

угу.. ссылка на константу

Цитата(Gunslinger @  30.12.2009,  21:21 Найти цитируемый пост)
Или аналогия с указателями неприменима? 

в полном смысле этого слова не применима, так как указатель самостоятельный объект и сам может быть константой.


Цитата(Gunslinger @  30.12.2009,  21:21 Найти цитируемый пост)
К подобному коду во всех учебниках говорится, что изменить такой объект нельзя. 

плохо книги смотрели..  smile ну а запустить пример хотя бы попробовали ?

Изменить объект нельзя когда он изначально задается как константный и может быть размещен в рид-онли мемори.
тут же мы один и тот же неконстантный объект передаем один раз посредством ссылки на константу,  другой - посредством простой ссылки.
то есть у нас получается два интерфейса к одному и тому же участку памяти : один read-only,  другой read-write.






Это сообщение отредактировал(а) mes - 30.12.2009, 22:56


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 31.12.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



С наступающим новым 2010м годом!

А теперь к скучномуsmile:
Цитата(mes @  30.12.2009,  22:55 Найти цитируемый пост)
Параметр - то что передаем, а аргумент , то что получает функция
две стороны одной медали smile

Цитата(Gunslinger @  30.12.2009,  21:21 Найти цитируемый пост)
К подобному коду во всех учебниках говорится, что изменить такой объект нельзя. 

плохо книги смотрели..  smile ну а запустить пример хотя бы попробовали ?
Изменить объект нельзя когда он изначально задается как константный и может быть размещен в рид-онли мемори.

О_О. Прямо утро откровений. Тогда: Тип Параметра=Аргумент smile Не, запустить не пробовал. Главный компилятор в голове.

Цитата(mes @  30.12.2009,  22:55 Найти цитируемый пост)

Цитата(Gunslinger @  30.12.2009,  21:21 Найти цитируемый пост)
константная ссылка==ссылка на константу? 

угу.. ссылка на константу

Цитата(Gunslinger @  30.12.2009,  21:21 Найти цитируемый пост)
Или аналогия с указателями неприменима? 

в полном смысле этого слова не применима, так как указатель самостоятельный объект и сам может быть константой.

Какой тогда смысл писать const к аргументу-ссылке, если константность объекта определяется в объявлении вызывающей программы? 
Если переменная не должна быть изменена в функции, то необходимо сделать ее константной в вызывающей программе? Или не обязательно - можно сделать константной функцию, куда передаются ссылки?

PM MAIL   Вверх
mes
Дата 31.12.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  31.12.2009,  09:55 Найти цитируемый пост)
Какой тогда смысл писать const к аргументу-ссылке, если константность объекта определяется в объявлении вызывающей программы? 

смысл в том, что функции не важно каким он объявлен в главной программе, но внутри функции он должен себя вести как ссылка на константу.
Одно из правил структурного программирования - возможность не держать все в голове, а делить на независимые составляющие.
Деление на функции это один из шагов к этому.

Добавлено @ 12:40
Цитата(Gunslinger @  31.12.2009,  09:55 Найти цитируемый пост)
_О. Прямо утро откровений. Тогда: Тип Параметра=Аргумент 

 smile 
как можно приравнять тип к значению ?! и у аргумента и у параметра есть свой тип, кстати они могут быть не одинаковыми,
тогда происходит преобразование (если возможно или ошибка в противном).

Код

void f(std::string const& str)
{
// str - аргумент переданный в функцию
}

f ("any string"); 
// "any string" - это строковой литерал переданный как параметр в функцию
// в последствии он будет приведен к const char * и на этой основе будет создан временный объект 
// пристыкованный к ссылке, и рассматриваемый внутри функции как str.



Это сообщение отредактировал(а) mes - 31.12.2009, 12:41


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 31.12.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(mes @  31.12.2009,  12:34 Найти цитируемый пост)
Цитата(Gunslinger @  31.12.2009,  09:55 Найти цитируемый пост)
_О. Прямо утро откровений. Тогда: Тип Параметра=Аргумент 

 smile 

Забыл поменять местами, извиняюсьsmile Меня этот момент интересует по следующей причине: один из обязательных конструкторов в пользовательских типах - конструктор копирования. Либо пишешь сам, либо создается компилятором. В одном из правил Мейерс пишет, что таким образом в аргумент функции передается параметр (такого же типа, разумеется), func(obj1(obj2));. Получается на аппаратном уровне такой высокоуровневый код разворачивается в ассемблерный код занесения пользовательских объектов в стек. У встроенных типов конструкторов нет, какой с++шный код ассоциируется с ассемблерной командой занесения в стек - хз.

Цитата(mes @  31.12.2009,  12:34 Найти цитируемый пост)
объявлен в главной программе, но внутри функции он должен себя вести как ссылка на константу.

Стоп!! 
Код

NameObject(const string& name, const& numb);
.....
no1("blablabla");

Это похоже на создание временного объекта и привязки к нему ссылки! Блин, не научусь читать код... Временный объект создается в стеке функции или вызывающей? Если смотреть только на семантику (не смотреть, что это передача в функцию), то в стеке функции...

Цитата(mes @  31.12.2009,  12:34 Найти цитируемый пост)
смысл в том, что функции не важно каким он объявлен в главной программе, но внутри функции он должен себя вести как ссылка на константу.

Ну так и получается, что раз ссылка константная, то внешний объект изменить нельзя, пусть он и объявлен без cоnst...


Это сообщение отредактировал(а) Gunslinger - 31.12.2009, 13:55
PM MAIL   Вверх
mes
Дата 31.12.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Gunslinger @  31.12.2009,  12:51 Найти цитируемый пост)
Забыл поменять местами

насколько я вижу, перемена слов того выражения  не приближает к сути..

Цитата(Gunslinger @  31.12.2009,  12:51 Найти цитируемый пост)
один из обязательных конструкторов в пользовательских типах - конструктор копирования.

Давайте для начала уточним, что такое для Вас конструктор, и чем он отличается от функции.

Цитата(Gunslinger @  31.12.2009,  12:51 Найти цитируемый пост)
Временный объект создается в стеке функции или вызывающей?

опять Вы не в ту сторону смотрите.. Не важно в чьем стеке, важно время жизни. 
Это как раз к разговору о том чем отличается блок функции от функционального блока.
первое - это блок который включает все тело функции,
а второе это любой блок.
То есть блок функции может состоять из одного или множества  включенных друг в друга функциональных блоков.
У функции один стек, однако время жизни переменных может сильно разниться
Код

f()
{  int i1;
  { int i2;
  }
   int i3;
}

к моменту создания i3, i2 будет уже уничтожена,а i1 удалится только после i3;

Цитата(Gunslinger @  31.12.2009,  12:51 Найти цитируемый пост)
Ну так и получается, что раз ссылка константная, то внешний объект изменить нельзя, пусть он и объявлен без cоnst...

в этом примере :
http://forum.vingrad.ru/index.php?showtopi...t&p=2061027
 значение объекта переданного по ссылке на константу (хотя и косвенно, но) меняется ..

Имхо Вы пытаетесь копнуть поглубже, чтоб найти истину, не разобравшись с тем что лежит на поверхности..
Это основная ошибка, потому что вся  суть лежит на поверхности, а в глубине лишь подробности, с которыми нельзя будет разобраться не понимая основ.
smile






--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1028 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.