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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода в конструкторе 
:(
    Опции темы
lv151
Дата 19.3.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 2



У Шилдта  - "Конструктор автоматически вызывается в момент создания объекта т.е. при его объявлении."
PM MAIL   Вверх
zim22
Дата 19.3.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



lv151, правильно. при объявлении объекта. но при объявлении класса.


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


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

У Шилдта  - "Конструктор автоматически вызывается в момент создания объекта т.е. при его объявлении." 


и...?
Код

MyClass::MyClass(int var) : var_(var) //инициализация проиходит тут
{
   //тут уже все инициализировано, то что не описано в списке инициализации - инициализируется по умолчанию (если это возможно)
}


чем одно мешает другому?
PM   Вверх
lv151
Дата 19.3.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 2



Я запутался smile. Можете "на пальцах" объяснить?

Добавлено @ 16:05
Цитата(azesmcar @  19.3.2009,  16:02 Найти цитируемый пост)
MyClass::MyClass(int var) : var_(var)

Всё ясно, был невнимателен.

Думал что:
Код

MyClass::MyClass()
{
   //тут уже все инициализировано, то что не описано в списке инициализации - инициализируется по умолчанию (если это возможно)
}


Это сообщение отредактировал(а) lv151 - 19.3.2009, 16:31
PM MAIL   Вверх
azesmcar
Дата 19.3.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

Я запутался smile. Можете "на пальцах" объяснить? 


Код

int i = 1; //это инициализация
int p; //неинициализированная переменная
int p = int(); //это инициализация по умолчанию


Код

MyClass::MyClass(int var)
   : var_(var) //это тоже
{

}

если создать обьект как
Код

MyClass v = MyClass(); //все члены явно не инициализированые в member initialization list инициализируются по умолчанию
MyClass v; //те члены класса которые явно не инициализированы в member initialization list останутся неинициализированными
                 //но  нормально созданными и готовыми к работе). Т.е. можно им присваивать и тому подобное..
                 //т.е. если что-то и неинициализировано, то о вашей вине.



Это сообщение отредактировал(а) azesmcar - 19.3.2009, 16:12
PM   Вверх
vinter
Дата 19.3.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(azesmcar @  19.3.2009,  17:11 Найти цитируемый пост)
MyClass v = MyClass(); //все члены явно не инициализированые в member initialization list инициализируются по умолчанию
MyClass v; //те члены класса которые явно не инициализированы в member initialization list останутся неинициализированными


azesmcar, в чем по твоему принципиальное отличие этих строк, что ты написал такую сильную разницу между ними? Между этими двумя записями нет ровно никакой разницы, исключая то, что в первом случе используется копирующий конструктор. И в первом и во втором случае, все non POD члены будут создан конструктором по умолчанию, а в POD типах будет мусор, если обратного не будет указано в списке инициализации


--------------------
Мой блог
PM MAIL WWW   Вверх
lv151
Дата 19.3.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 2



Спасибо.

Был невнимателен. 
Думал что:

Код

MyClass::MyClass()
{
   //тут уже все инициализировано, то что не описано в списке инициализации - инициализируется по умолчанию (если это возможно)
}


: var_(var) - незаметил smile.

Это сообщение отредактировал(а) lv151 - 19.3.2009, 16:33
PM MAIL   Вверх
azesmcar
Дата 19.3.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



vinter, не совсем, 
Код

class MyClass
{
public:
    int a;
};

int main()
{
    MyClass t;
    std::cout << t.a << std::endl;
    MyClass p = MyClass();
    std::cout << p.a << std::endl;
    return 0;
}


результат
Код

2019276528
0


Добавлено через 1 минуту и 47 секунд
если не делать new
Код

MyClass *t = new MyClass(); 


можно так, но MyClass s() компилятор понимает как обявление прототипа функции с возвращаемым типом MyClass.
PM   Вверх
lv151
Дата 19.3.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 2



Цитата(azesmcar @  19.3.2009,  16:34 Найти цитируемый пост)
vinter, не совсем, 
Выделить всёкод C++
class MyClass
{
public:
    int a;
};
int main()
{
    MyClass t;
    std::cout << t.a << std::endl;
    MyClass p = MyClass();
    std::cout << p.a << std::endl;
    return 0;
}
    
2019276528
0

 


VC 6.0 
 -858993460
 -858993460

Это сообщение отредактировал(а) lv151 - 19.3.2009, 16:58
PM MAIL   Вверх
vinter
Дата 19.3.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



azesmcar, интересная особенность. Учитывая, что some_class obj; и some_class obj(); эквивалентные записи... 


--------------------
Мой блог
PM MAIL WWW   Вверх
azesmcar
Дата 19.3.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



lv151, VC 6.0 не в счет.

Цитата

azesmcar, интересная особенность. Учитывая, что some_class obj; и some_class obj(); эквивалентные записи...  


это тоже не совсем так, ибо some_class obj(); это обявление прототипа функции с возвращаемым типом some_class не принимающей параметров.
Код

class some_class
{
};

int main()
{
    some_class obj();
    return 0;
}



Цитата

'some_class obj(void)': prototyped function not called (was a variable definition intended?)

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


uploading...
****


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

Репутация: 52
Всего: 211



Добавлю статью из МСДН
http://msdn.microsoft.com/en-us/library/s0wk5dy9.aspx
Код

int main()
{
    // points to unitialized int (value at *pi0 is indeterminate)
    int *pi0 = new int;  

    // pointer to a default initialized int (*pi1 == 0) 
    int *pi1 = new int();

    delete pi0;
    delete pi1;
}


в стандарте пока не нашел, но не думаю что стоит искать
Цитата

 The following sample works in Visual C++ .NET 2003 as specified in the standard: 

не думаю что МСДН врет

Это сообщение отредактировал(а) azesmcar - 19.3.2009, 18:17
PM   Вверх
vinter
Дата 19.3.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(azesmcar @  19.3.2009,  19:15 Найти цитируемый пост)
Добавлю статью из МСДНhttp://msdn.microsoft.com/en-us/library/s0wk5dy9.aspx

с этим никто не спорит, если у встроенных типов добавить скобки при определении, тогда она будет проинициализирована 0. У класса нет разницы, есть скобки или нет. Дефолтовый конструктор вызовется в любом случае.НО при этом он не должен обнулять внутренние pod члены. Возможно это фича студии, что при таком выражении оно обнуляет. Я бы не стал на это полагаться.

Добавлено через 1 минуту и 9 секунд
Цитата

 i0 value indeterminate

оттуда же кстати


--------------------
Мой блог
PM MAIL WWW   Вверх
azesmcar
Дата 19.3.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

НО при этом он не должен обнулять внутренние pod члены. Возможно это фича студии, что при таком выражении оно обнуляет. Я бы не стал на это полагаться.


Я бы тоже не стал, потому что нет никакой гарантии что тот кто будет использовать ваш класс - проинициализирует его со скобками. Но если мне не изменяет память Саттер говорил, что класс проинициализированный со скобками, инициализирует также все внутренние pod члены.

Добавлено через 2 минуты и 20 секунд
Цитата

Возможно это фича студии


щас GCC проверим

Добавлено через 6 минут и 16 секунд
Цитата

[guest@server guest]$ cat test.cpp
#include <iostream>

class MyClass
{
public:
    int a;
};
int main()
{
    MyClass t;
    std::cout << t.a << std::endl;
    MyClass p = MyClass();
    std::cout << p.a << std::endl;
    return 0;
}

[guest@server guest]$ g++ test.cpp
[guest@server guest]$ ./a.out
1506560
0


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

i0 value indeterminate


ну ясно, потому что класс создан без скобок. Я попробую найти что Саттер писал по этому поводу.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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