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

Поиск:

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


Опытный
**


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

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




1.    Инициализация – вызов конструктора (по\не по умолчанию)?
2.    Определение – обычное присваивание?
3.    Когда через конструктор присваиваем внутренним переменным значение, используется =. В чем тогда разница между определением? 
4.    Инициализация по умолчанию производится для каких встроенных типов?

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


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


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

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



Цитата(Gunslinger @  29.12.2009,  08:23 Найти цитируемый пост)
1.    Инициализация – вызов конструктора (по\не по умолчанию)?

конструктор есть только у классовых типов, инициализация же есть у всех.

Цитата(Gunslinger @  29.12.2009,  08:23 Найти цитируемый пост)
2.    Определение – обычное присваивание?

Определение переменной это выделение памяти под нее, а описание это просто упоминание.

Цитата(Gunslinger @  29.12.2009,  08:23 Найти цитируемый пост)
Когда через конструктор присваиваем внутренним переменным значение, используется =. В чем тогда разница между определением? 

можно инициализировать внутренние члены в списке инициализации, а можно присваивать им значения в теле конструктора.
в одном случае - инициализация в  другом - присвоение.

Цитата(Gunslinger @  29.12.2009,  08:23 Найти цитируемый пост)
4.    Инициализация по умолчанию производится для каких встроенных типов?

для всех простых (POD) типов объекты которых определены статически.




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


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


Опытный
**


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

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



У Мейерса есть такой пример, немного изменил:
Код

class NameObject{
public:
   NameObject(const string& name, const& numb);

private:
    string nameVale;
    int iVale;
};
...
NameObject no1("blablabla",2);

Не пишет, что будет ошибка. Получается при создании no1 для свойств не произошло вызова их конструкторов по умолчанию, это было только объявление. Их инициализация (или определение?) было произведено в конструкторе объекта.
PM MAIL   Вверх
mes
Дата 29.12.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Gunslinger @  29.12.2009,  13:22 Найти цитируемый пост)
Не пишет, что будет ошибка. Получается при создании no1 для свойств не произошло вызова их конструкторов по умолчанию, это было только объявление. Их инициализация (или определение?) было произведено в конструкторе объекта. 

 smile  smile  smile 
Вы смешали все кучу.. тут даже не понятно с какой стороны начинать распутывать..
 smile 


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


Опытный
**


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

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



Код

MyType type;    

Если в конструкторе по умолчанию происходит присваивание внутренним переменным значения, то они сразу же получат значения. Получается, это объявление и инициализация. Технически: выделяется память и туда записывается соответствующее значение.
Код

string nameVale;
int iVale;
 

1. По аналогии переменные встроенного типа так же объявлены, а затем автоматически инициализированы. Но это оказывается не так.
2. Инициализация – это ведь тоже присвоение значения, т.е. память выделяется и в нее записывается какое-либо значение. В чем тогда отличие от определения?



Это сообщение отредактировал(а) Gunslinger - 29.12.2009, 16:56
PM MAIL   Вверх
artsb
Дата 29.12.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gunslinger @  29.12.2009,  16:49 Найти цитируемый пост)
2. Инициализация – это ведь тоже присвоение значения, т.е. память выделяется и в нее записывается какое-либо значение. В чем тогда отличие от определения?

Инициализация - это когда вы явно присвоили значение переменной при объявлении.
Определение - это просто объявление переменной. И она никак не инициализируется, если речь идёт о базовых типах. Т.е.
Код

int b = 0; // инициализация нулём
int c;       // в переменной может быть всё что угодно - мусор

В случае с классом - вызывается его конструктор, который инициализирует переменные класса.


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


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


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

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



extern type val; // описание объявление переменной - просто упоминание
type val; // определение переменной  - выделение места с возможной инициализацией
type val = 4;  // определение переменной с явной инициализаций
val = 5;  // присвоение

Добавлено @ 18:33
Цитата(Gunslinger @  29.12.2009,  15:49 Найти цитируемый пост)
Инициализация – это ведь тоже присвоение значения,

не совсем.. например константу проинициализировать можно (и нужно), а присвоить ничего нельзя..
и не важно что на низком уровне инициализация и присвоение могут быть реализованы одинаково.

Добавлено @ 18:37
Цитата(artsb @  29.12.2009,  16:37 Найти цитируемый пост)
Инициализация - это когда вы явно присвоили значение переменной при объявлении.

не объявлении, а при определении.. и это явная инициализация, а может быть неявная.. и "присвоили" здесь не несет смысл присвоения.

Цитата(artsb @  29.12.2009,  16:37 Найти цитируемый пост)
Определение - это просто объявление переменной.

неа smile


Это сообщение отредактировал(а) mes - 29.12.2009, 19:08


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


Эксперт
****


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

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



Цитата(mes @  29.12.2009,  18:30 Найти цитируемый пост)
не объявлении, а при определении

а в чём разница?

Цитата(mes @  29.12.2009,  18:30 Найти цитируемый пост)
неа


Цитата(mes @  29.12.2009,  18:30 Найти цитируемый пост)
type val; // определение переменной

type val; - это же объявление переменной.


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


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


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

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



Цитата(artsb @  29.12.2009,  17:44 Найти цитируемый пост)

type val; - это же объявление переменной. 


для переменных объявление происходит посредством употребления extern. smile


Это сообщение отредактировал(а) mes - 29.12.2009, 18:50


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


Эксперт
****


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

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



ну вы же сами писали:
Цитата

extern type val; // описание

smile


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


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


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

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



Цитата(artsb @  29.12.2009,  18:00 Найти цитируемый пост)
ну вы же сами писали:

сорри.. там объявление.



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


Эксперт
****


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

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



Вроде стало ясно smile Хотя во всех книгах пишут: Объявим переменную:
Код

int b;



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


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


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

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



Цитата(artsb @  29.12.2009,  19:03 Найти цитируемый пост)
Хотя во всех книгах пишут: Объявим переменную:

а это уже издержки  перевода.. тем более что нам не важно где определена переменная..
то есть примеры 
Код

int b;
some_func(b);

Код

extern int b;
some_func(b);
//b.cpp
int b;

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


Но если рассматривается именно конструкция, и  хотя любое определение содержит в себе объявление, называть объявлением определение некорректно.



Это сообщение отредактировал(а) mes - 29.12.2009, 20:51


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


Эксперт
****


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

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



Игра слов. Забавно. smile Спасибо.


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


Опытный
**


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

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



Цитата(mes @  29.12.2009,  18:49 Найти цитируемый пост)
для переменных объявление происходит посредством употребления extern

если
Код

extern int m;

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

Код

int m;

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

Код

int m=4;

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

Цитата(mes @  29.12.2009,  18:30 Найти цитируемый пост)

не совсем.. например константу проинициализировать можно (и нужно), а присвоить ничего нельзя..

Вот поэтому код из первого поста мне и не понятен. Повторю:
Код

class NameObject{
public:
   NameObject([U]const[/U] string& name, const& numb);
private:
    [I]string[/I] nameVale; //нет никакого extern
    int iVale;
};
...
NameObject no1([U]"blablabla"[/U],2);

Либо константный аргумент не тоже самое, что и константная переменная, либо константу дозволяется инициализировать позже, если она не инициализирована (но тогда неявной инициализации у string нет).

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

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

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

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

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


 




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


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

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