Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2008, 16:20   #1
Rembo
Форумчанин
 
Аватар для Rembo
 
Регистрация: 29.10.2007
Сообщений: 628
По умолчанию Конструктор по умолчанию

Здравствуйте! Я вот прохожу раздел "Аргументация конструирования", и у меня появилось несколько вопросов: В книге было написано, что если вы не создаете конструктор, то конструктор создается сам, по умолчанию, для того, что бы про инициализировать данные-члены объекта нулем. Так почему же при компиляции этого кода:
Код:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

class student
{
     public:
        int arg;
      };

int main(int nNumberofArgs, char* pszArgs[])
{
student chelovek;
cout << "arg = " << chelovek.arg <<endl; 
   system("PAUSE");
    return 0; 
}
Результат таков: arg = 2. Почему не работает этот конструктор по умолчанию? почему arg не равно нулю? Или я в этой теме что то не понял? Подскажите пожалуйста...
Rembo вне форума Ответить с цитированием
Старый 29.07.2008, 17:30   #2
kezman
Пользователь
 
Аватар для kezman
 
Регистрация: 09.07.2008
Сообщений: 26
По умолчанию

Если я не ошибаюсь, то конструктор по умолчанию это конструктор без параметров (чаще всего и с пустым тело). Т.е.

Код:
 class student  
 { 
      public: 
         int arg; 
        student(){} // вот этот самый конструктор
       };
И он позволяет инициализировать переменные в таком виде :
Код:
student a;
потому что, если ты напишешь еще какой-нибудь конструктор (например, конструктор который инициализирует все поля), но не напишешь конструктор по умолчанию, то у тебя не скомпилируется этот код
Код:
student a;
kezman вне форума Ответить с цитированием
Старый 29.07.2008, 19:39   #3
Rembo
Форумчанин
 
Аватар для Rembo
 
Регистрация: 29.10.2007
Сообщений: 628
По умолчанию

Ехх, что то я все равно ничего не понял...
Цитата:
Сообщение от kezman Посмотреть сообщение
Если я не ошибаюсь, то конструктор по умолчанию это конструктор без параметров (чаще всего и с пустым тело).
Да, с этим соглашусь, это верно, в книге тоже об этом писалось. Но вопрос вот в чем: В книге говорилось о том, что если вы НЕ создаете конструктор, то компилятор сам его создает. И этот конструктор выполняет одну цель: Инициализирует данные-члены объекта Нулем. Поэтому:
Код:
    #include <cstdio>  
    #include <cstdlib>  
   #include <iostream>  
    using namespace std;  
      
    class student  
    { 
         public: 
            int arg; 
         };  
     
   int main(int nNumberofArgs, char* pszArgs[])  
   { 
   student chelovek; 
   cout << "arg = " << chelovek.arg <<endl;  
      system("PAUSE"); 
       return 0;  
   }
В этой программе я не создаю конструктор, по "книге" компилятор сам должен создать конструктор, который инициализирует члены нулем, но почему вывод таков: arg = 2 , а не arg = 0. И почему именно "2"??? Или я сам что-то неправильно понял? вообщем я полностью запутался, помогите пожалуйста...
Rembo вне форума Ответить с цитированием
Старый 29.07.2008, 20:12   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

ну тут наверно зависит от компилятора, что он сгенерирует, но что-то мне кажется не будет он генерировать такой "обнуляющий" конструктор. конструктор с пустым телом должен создать по идее в такой ситуации. А 2 - это просто видимо "мусор"
pu4koff вне форума Ответить с цитированием
Старый 29.07.2008, 20:47   #5
Rembo
Форумчанин
 
Аватар для Rembo
 
Регистрация: 29.10.2007
Сообщений: 628
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
конструктор с пустым телом должен создать по идее в такой ситуации.
ну а что дает нам этот "пустой" конструктор?
Код:
 #include <cstdio>    
  #include <cstdlib>    
 #include <iostream>    
  using namespace std;    
      
  class student    
  {  
       public:  
student(){} // вот этот самый конструктор           
int arg;  
       };    
     
 int main(int nNumberofArgs, char* pszArgs[])    
 {  
 student chelovek;  
 cout << "arg = " << chelovek.arg <<endl;   
    system("PAUSE");  
     return 0;   
 }
Если я добавлю строчку student(){}, то все равно результат: arg = 2. Или пустой конструктор не обнуляет данные-члены?
Rembo вне форума Ответить с цитированием
Старый 29.07.2008, 20:48   #6
oblom
Пользователь
 
Аватар для oblom
 
Регистрация: 22.09.2007
Сообщений: 71
По умолчанию

http://programmersclub.ru/23/
"Пилите, Шура, пилите. Они золотые".....
oblom вне форума Ответить с цитированием
Старый 29.07.2008, 21:30   #7
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

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

Насколько я помню, чтобы компилятор определил неявный конструктор по умолчанию, который все обнулит, необходимо:
- чтобы не был объявлен ни один конструктор.
- явный вызов конструктора по умолчанию, например, A a = A()

Т.е. нужно добиться примерно следующего:
Код:
#include <iostream>  

class A {
public:
  int value;
};

int main()  
{ 
  A a = A();
  std::cout << a.value << std::endl;
}
filosof_x86 вне форума Ответить с цитированием
Старый 29.07.2008, 21:52   #8
Rembo
Форумчанин
 
Аватар для Rembo
 
Регистрация: 29.10.2007
Сообщений: 628
Радость

filosof_x86, спасибо, вот это уже хорошая информация. Посмотрите пожалуйста ссылку, там я как раз выложил тот фрагмент из книги. http://img144.imageshack.us/my.php?image=hghbr2.png
Что вы думаете по этому поводу? (я там красными линиями подчеркнул).
Rembo вне форума Ответить с цитированием
Старый 29.07.2008, 22:10   #9
kezman
Пользователь
 
Аватар для kezman
 
Регистрация: 09.07.2008
Сообщений: 26
По умолчанию

сделай student(){arg=0;}
У меня компилятор minGW ( Dev-C++)
и он сам не создает никакие конструкторы. Теперь насчет фрагмента книги.

1. Можно создать класс без конструкторов...просто с конструкторами легче и нагляднее. Это на мой взгляд.
2. С++ точно не создает ничего. С++ это язык. Создает компилятор...хотя как я уже говорил мой, Dev-C++, ничего не создает.

ЗЫ Найди норм книгу. Вообще море литературы по С++ есть в "выделенной теме" в этом разделе.
kezman вне форума Ответить с цитированием
Старый 30.07.2008, 09:54   #10
Rembo
Форумчанин
 
Аватар для Rembo
 
Регистрация: 29.10.2007
Сообщений: 628
По умолчанию

Спасибо всем за помощь, вроде разобрался...
Rembo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить содинение по умолчанию ? Crazyman Работа с сетью в Delphi 5 30.06.2008 00:24
Конструктор копирования Djaconda Общие вопросы C/C++ 3 11.06.2008 18:54
значения по умолчанию azat БД в Delphi 5 11.12.2007 15:56
Дата по умолчанию ГОСЕАН БД в Delphi 3 11.07.2007 19:33
Конструктор объектов Yoger Общие вопросы Delphi 10 20.04.2007 12:45