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

Поиск:

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


Опытный
**


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

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



С наступившим!smile

Цитата(mes @  31.12.2009,  14:32 Найти цитируемый пост)
У функции один стек, однако время жизни переменных может сильно разниться

Теперь понял, спасибо.

Цитата(mes @  31.12.2009,  14:32 Найти цитируемый пост)
в этом примере :
http://forum.vingrad.ru/index.php?showtopi...t&p=2061027

Код

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

Я говорил про это же: ci из функции f изменить нельзя.
Получается так:
1. У встроенных типов конструкторов нет. Поэтому
2. если написать int g;, то создастся переменная с мусором в качестве значения. Это объявление
3. int m=2; - объявление и инициализация. Инициализация -- когда в переменную пишем только когда она только что объявлена (как в примере) или не важно, можно где-то после объявления? Т.е. инициализацией называют самое первое присваивание (неважно, когда его делаем), которое затирает мусор?
4. Объявление -- присвоение переменной нового значения, т.е. затирание не мусора, а значения, ранее записанного программистом?
5. Оффтоп: конструктор копирования нужен, чтобы можно было передавать пользовательский объект в функцию (по значению, конечно)?

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


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


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

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



Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
Я говорил про это же: ci из функции f изменить нельзя.

да нельзя.. но почему ci дает разный результат на каждой итерации цикла ?


Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
У встроенных типов конструкторов нет. 

нету

Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
Поэтому
2. если написать int g;, то создастся переменная с мусором в качестве значения.

не поэтому 

Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
Это объявление

это определение


Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
3. int m=2; - объявление и инициализация. 

определение и инициалиыация


Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
Инициализация -- когда в переменную пишем только когда она только что объявлена (как в примере) или не важно, можно где-то после объявления? 

не обьявления, а создания

Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
Т.е. инициализацией называют самое первое присваивание (неважно, когда его делаем), которое затирает мусор?

это не присваивание.. 
1. возьмите инициализацию ссылки - в контексте присваивания  это рассматривать нельзя..
2. она не должна затирать мусор .. она должна привадитэ обьект в начальное состояние..


Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
4. Объявление -- присвоение переменной нового значения, т.е. затирание не мусора, а значения, ранее записанного программистом?

нет нет нет нет


Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
5. Оффтоп: конструктор копирования нужен, чтобы можно было передавать пользовательский объект в функцию (по значению, конечно)?

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



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


Опытный
**


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

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



Цитата(mes @  1.1.2010,  19:21 Найти цитируемый пост)
Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
Я говорил про это же: ci из функции f изменить нельзя.

да нельзя.. но почему ci дает разный результат на каждой итерации цикла ?

Не обратил внимание на второй параметр.. Упустил такой вариант, изменить можно. Хотя таких психов надо поискать.

Цитата(mes @  1.1.2010,  19:21 Найти цитируемый пост)
Цитата(Gunslinger @  1.1.2010,  15:47 Найти цитируемый пост)
1. У встроенных типов конструкторов нет. Поэтому
2. если написать int g;, то создастся переменная с мусором в качестве значения.

не поэтому 

Зависит от реализации компилятора?

Цитата(Gunslinger @  1.1.2010,  16:47 Найти цитируемый пост)
. если написать int g;

Цитата(mes @  1.1.2010,  19:21 Найти цитируемый пост)
это определение

Всегда думал, что подобный текст - объявление. Что же такое объявление?

Цитата(mes @  1.1.2010,  19:21 Найти цитируемый пост)
она не должна затирать мусор .. она должна привадитэ обьект в начальное состояние..

"Затирать мусор" имел ввиду присвоение к нужному значению. Вроде тоже самое.

Концептуальный процесс: выделение памяти для объекта; присвоение объекту первоначального значения (либо нужного, либо "технического" -- 0); изменение значения объекта (в процессе работы). Так вот на такой схеме: что есть что?

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


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Gunslinger @  2.1.2010,  17:30 Найти цитируемый пост)
Всегда думал, что подобный текст - объявление. Что же такое объявление?

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

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

вот объявление:
Код

extern int a;


а вот определение:
Код

int a;

***
не поленюсь из книги привести цитату, уж больно хорошо объясняется.
isbn 5-8459-1121-4 (рус)
isbn 0-201-72148-1(англ)
Цитата

2.3.5. Declarations and Definitions
As we'll see in Section 2.9 (p. 67), C++ programs typically are composed of many files. In order for multiple files to access the same variable, C++ distinguishes between declarations and definitions.
definition of a variable allocates storage for the variable and may also specify an initial value for the variable. There must be one and only one definition of a variable in a program.
declaration makes known the type and name of the variable to the program. A definition is also a declaration: When we define a variable, we declare its name and type. We can declare a name without defining it by using the extern keyword. A declaration that is not also a definition consists of the object's name and its type preceded by the keyword extern:
Код

extern int i;   // declares but does not define i
int i;          //  declares and defines i

An extern declaration is not a definition and does not allocate storage. In effect, it claims that a definition of the variable exists elsewhere in the program. A variable can be declared multiple times in a program, but it must be defined only once.

A declaration may have an initializer only if it is also a definition because only a definition allocates storage. The initializer must have storage to initialize. If an initializer is present, the declaration is treated as a definition even if the declaration is labeled extern:
Код

extern double pi = 3.1416; // definition

Despite the use of extern, this statement defines pi. Storage is allocated and initialized. An extern declaration may include an initializer only if it appears outside a function.

Because an extern that is initialized is treated as a definition, any subseqent definition of that variable is an error:
Код

extern double pi = 3.1416; // definition
double pi;                 // error: redefinition of pi

Similarly, a subsequent extern declaration that has an initializer is also an error:
Код

extern double pi = 3.1416; // definition
extern double pi;          // ok: declaration not definition
extern double pi = 3.1416; // error: redefinition of pi

The distinction between a declaration and a definition may seem pedantic but in fact is quite important.
NOTE: In C++ a variable must be defined exactly once and must be defined or declared before it is used.


Это сообщение отредактировал(а) zim22 - 2.1.2010, 18:52


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


Опытный
**


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

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



Цитата(zim22 @  2.1.2010,  18:41 Найти цитируемый пост)
объявлять переменные можно сколько угодно раз. определены же они должны быть только один раз.
тоже самое касается и функций.

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

Фигово по переводной литературе обучаться... Даже и не думал, что объявление -- это extern. Что за книга?
Значит, 
1. объявление -- extern: память не выделяется.  extern используется только для объявления встроенных типов и самостоятельных функций? Для классов есть include.
2. Определение -- обычное создание переменной, вроде int d: память выделяется, в ней лежит мусор
3. Инициализация -- первоначальное присвоение значения. Далее по программе -- уже не инициализация, а присвоение.
Так?

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


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Gunslinger @  3.1.2010,  12:04 Найти цитируемый пост)
Что за книга?

Цитата(zim22 @  2.1.2010,  17:41 Найти цитируемый пост)
isbn 5-8459-1121-4 (рус)
isbn 0-201-72148-1(англ)


Цитата(Gunslinger @  3.1.2010,  12:04 Найти цитируемый пост)
Так?

нет
1. есть объявления переменных, функций, предварительные объявления классов.
объявления переменных - это extern
Код

extern int i;
struct S { };
extern S myS;

объявление функций - это просто строка с прототипом функции (без её тела)
Код

void fcn();

предв.объявление класса (forward declaration) - это ключевое слово class за которым следует имя класса, заканчивающееся ;
Код

class X;
class Z {
  void f(X&);
};

Цитата(Gunslinger @  3.1.2010,  12:04 Найти цитируемый пост)
2. Определение -- обычное создание переменной, вроде int d: память выделяется, в ней лежит мусор

не обязательно мусор. для пользовательских типов данных будут вызваны конструкторы. 
встроенные типы данных, определённые в глобальной области видимости, будут инициализированы значением по умолчанию для их типа (нулём или пустой строкой).
также любое определение  является и объявлением.
***
объявление - declaration
определение - definition


Это сообщение отредактировал(а) zim22 - 3.1.2010, 13:22


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


Опытный
**


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

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



Цитата(zim22 @  3.1.2010,  13:19 Найти цитируемый пост)
объявление функций - это просто строка с прототипом функции (без её тела)

Вспомнил, читал. Смысл тотже самый, что и extern. Весь нюанс между объявлением и определением в том, что под объявленный объект память не выделяется и присвоение такому объекту значения будет ошибкой?
PM MAIL   Вверх
zim22
Дата 3.1.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Gunslinger @  3.1.2010,  14:17 Найти цитируемый пост)
 и присвоение такому объекту значения будет ошибкой?

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


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


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


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

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



Цитата(Gunslinger @  3.1.2010,  14:17 Найти цитируемый пост)
Весь нюанс между объявлением и определением в том, что под объявленный объект память не выделяется и присвоение такому объекту значения будет ошибкой

присвоение тут второстепенно.. если объект только объявлен, но не определен, значит его не существует. 
а ньанс в том, что 
Цитата(zim22 @  2.1.2010,  17:41 Найти цитируемый пост)
объявлять переменные можно сколько угодно раз. определены же они должны быть только один раз.


и почитайте наконец то (внимательно и с разбором) хоть какую нибудь книжку по C++.. а то толчем воду в ступе...




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


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


Опытный
**


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

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



Цитата(zim22 @  3.1.2010,  16:19 Найти цитируемый пост)
просто откомпиль

поставил компиляторsmile
Цитата(mes @  3.1.2010,  17:56 Найти цитируемый пост)
и почитайте наконец то (внимательно и с разбором) хоть какую нибудь книжку по C++.. а то толчем воду в ступе...

Нашел книгу, о которой писал zim22, и еще кое-какие. Праздничные дни еще остались -- пошел не спеша читать.

Спасибо за помощь.




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


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


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

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



Цитата(Gunslinger @  7.1.2010,  08:43 Найти цитируемый пост)
поставил компиляторsmile

откройте для себя компилятор, который в инете всегда под рукой  smile 
http://codepad.org/



--------------------
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.1134 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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