Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.93
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
#1

Конструкторы по умолчанию. - C++

29.12.2011, 20:03. Просмотров 7282. Ответов 19
Метки нет (Все метки)

Здравствуйте, возник вопрос. Только что минут 10 въезжал что у меня не так. Суть вот в чем. Есть некий класс, в моем случае например digit. Есть 3 конструктора, 1 по умолчанию без аргументов, 2 с параметрами. Проблема в том, что когда я начал проверять конструкторы, то есть объявлять объект данного класса с инициализацией, все вроде бы было нормально пока я не дошел до конструктора по умолчанию. Дело в том, что я не удалял скобки после теста конструктора с аргументом, просто удалял значения из них. Получалось вот так
C++
1
digit a();
Конструктор по умолчанию инициализирует объект нулем, но при выводе
C++
1
std::cout << a;
выводилась единица. Я добавил в конструктор
C++
1
std::cout << "blabla";
но ничего не выводилось при создании объекта. Если написать без скобок то все нормально. Почему так? Откуда берется единица? Проверял на другом классе, точно так же все, и та же самая единица, хотя почему то конструктор не вызывается.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2011, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструкторы по умолчанию. (C++):

Заменить конструкторы на конструктор по умолчанию - C++
Подскажите,пожалуйста, как изменить код программы, чтобы вместо конструктуров был конструктор по умолчанию,а программа работала по...

Что такое конструкторы классов, копирования, по умолчанию с запретом неявного приведения аргументов? - C++
Что такое конструкторы классов, конструкторы копирования, конструкторы по умолчанию и конструкторы с запретом неявного приведения...

Написать класс «массив» (В классе реализовать следующие методы: конструкторы (по умолчанию, с параметрами,) - C++
помогите пожалуйста! необходимо: 1. Написать класс «массив». 2. В классе реализовать следующие методы: конструкторы (по умолчанию, с...

Конструкторы - C++
Объясните на пальцах, для чего нужны конструкторы?

Конструкторы C++ - C++
Объясните, пожалуйста, своими словами, что являют собой конструкторы, для чего они нужны, в чем их преимущество перед аналогичными...

Конструкторы - C++
Пытаюсь разработайте класс представления окна на экране компьютера. В состав должны войти следующие конструкторы: -конструктор по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimcoder
Полярный
462 / 434 / 68
Регистрация: 11.09.2011
Сообщений: 1,134
29.12.2011, 20:08 #2
Код в студию.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.12.2011, 20:27  [ТС] #3
Да код не принципиален. Но вот к примеру такой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class digit {
    friend std::ostream &operator<<( std::ostream &, const digit & );
    
  public:
    digit();
    digit( const int & );
    ~digit();
    
  private:
    unsigned char d;
    const int getD() const;
};
 
digit::digit()
: d( 0 ) {
}
 
digit::digit( const int &a )
: d( a ) {
}
 
const int digit::getD() const {
    return d;
}
 
std::ostream &operator<<( std::ostream &output, const digit &dig ) {
    output << dig.getD( );
 
    return output;
}
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:32 #4
Цитата Сообщение от Toshkarik Посмотреть сообщение
Откуда берется единица?
Патамушта варнинги отключать не надо.
Код
main.cpp:40:18: warning: the address of ‘digit d()’ will always evaluate as ‘true’ [-Waddress]
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.12.2011, 20:34  [ТС] #5
Странно, но я ничего не отключал. Стоит debug конфигурация, никаких warning не было.
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 20:35 #6
Пример входных, выходных, и желаемых выходных данных предоставте пожалуйста.
0
dimcoder
Полярный
462 / 434 / 68
Регистрация: 11.09.2011
Сообщений: 1,134
29.12.2011, 20:36 #7
А откуда нам знать откуда берётся "blabla"?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да код не принципиален
Это не факт.
+
У вас названо 3 конструктора, вы и выложите оригинал, от строки до строки. Не выкладывайте только остальные функции (мэйн выложите)
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 20:38 #8
Цитата Сообщение от soon Посмотреть сообщение
Патамушта варнинги отключать не надо.
http://codepad.org/OTvRWPbE
Какие?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:38 #9
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
soon@bt:~/Desktop$ cat main.cpp
#include <iostream>
 
int main()
{
    int a();
    std::cout << a << std::endl;
    return 0;
}
soon@bt:~/Desktop$ g++ -Wall main.cpp -o main
main.cpp: In function ‘int main()’:
main.cpp:6:18: warning: the address of ‘int a()’ will always evaluate astrue[-Waddress]
soon@bt:~/Desktop$ ./main
1
soon@bt:~/Desktop$
Проверьте, с какими параметрами среда компилирует проект
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.12.2011, 20:39  [ТС] #10
Я же написал в первом сообщение, данные не важны. Конструктор по умолчанию инициализирует нулем. Вот пример использования:
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
    setlocale( LC_ALL, "RUS" );
    
    digit b( 7 );
    
    std::cout << b << std::endl; //здесь выводится 7
 
    std::cout << '\a' << std::endl;
    system( "pause" );
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
    setlocale( LC_ALL, "RUS" );
    
    digit b();
    
    std::cout << b << std::endl; //здесь выводится 1
 
    std::cout << '\a' << std::endl;
    system( "pause" );
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
    setlocale( LC_ALL, "RUS" );
    
    digit b;
    
    std::cout << b << std::endl; //здесь выводится 0
 
    std::cout << '\a' << std::endl;
    system( "pause" );
    return 0;
}
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:39 #11
Цитата Сообщение от go Посмотреть сообщение
Какие?
Из первого сообщения ТС, там надо было еще
C++
1
2
digit d();
std::cout << d << std::endl;
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.12.2011, 20:52  [ТС] #12
Вот лог построения
Лог
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/c/Users/Toxa/Documents/NetBeansProjects/CppApplication_1'
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/cppapplication_1.exe
make[2]: Entering directory `/c/Users/Toxa/Documents/NetBeansProjects/CppApplication_1'
mkdir -p build/Debug/MinGW-Windows/_ext/42866081
rm -f build/Debug/MinGW-Windows/_ext/42866081/huge_int.o.d
g++.exe -c -g -I/F/Programming/Libraries/Includes/My\ Work -MMD -MP -MF build/Debug/MinGW-Windows/_ext/42866081/huge_int.o.d -o build/Debug/MinGW-Windows/_ext/42866081/huge_int.o /F/Programming/Libraries/Includes/My\ Work/Huge\ Int/huge_int.cpp
mkdir -p build/Debug/MinGW-Windows/_ext/606542049
rm -f build/Debug/MinGW-Windows/_ext/606542049/digit.o.d
g++.exe -c -g -I/F/Programming/Libraries/Includes/My\ Work -MMD -MP -MF build/Debug/MinGW-Windows/_ext/606542049/digit.o.d -o build/Debug/MinGW-Windows/_ext/606542049/digit.o /F/Programming/Libraries/Includes/My\ Work/Huge\ Int/Digit/digit.cpp
mkdir -p build/Debug/MinGW-Windows
rm -f build/Debug/MinGW-Windows/main.o.d
g++.exe -c -g -I/F/Programming/Libraries/Includes/My\ Work -MMD -MP -MF build/Debug/MinGW-Windows/main.o.d -o build/Debug/MinGW-Windows/main.o main.cpp
mkdir -p dist/Debug/MinGW-Windows
g++.exe -o dist/Debug/MinGW-Windows/cppapplication_1 build/Debug/MinGW-Windows/_ext/42866081/huge_int.o build/Debug/MinGW-Windows/_ext/606542049/digit.o build/Debug/MinGW-Windows/main.o
make[2]: Leaving directory `/c/Users/Toxa/Documents/NetBeansProjects/CppApplication_1'
make[1]: Leaving directory `/c/Users/Toxa/Documents/NetBeansProjects/CppApplication_1'


Добавлено через 7 минут
Вбил только что на liveworkspace и вправду warning выскочил. Какой параметр нужен компилятору? -Waddress? И мне все таки интересно, чем отличается инициализация с пустыми скобками и без скобок.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:58 #13
Toshkarik, добавьте в параметры компиляции -Wall

Добавлено через 5 минут
На Waddress выдает варнинги как ошибки. В принципе, кому как больше нравится.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
29.12.2011, 20:58  [ТС] #14
Спасибо, добавил. Так в чем проблема данной инициализации? Может где нибудь написано про это?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 21:35 #15
Цитата Сообщение от Toshkarik Посмотреть сообщение
Может где нибудь написано про это
Стандарт штудирую. Советую присоединится, полагаю копать надо в сторону главы 8.5 Initializer или 8.4 Function
Если попытаться вывести адрес int a(), то выдаст 1. Так, между словом.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2011, 21:35
Привет! Вот еще темы с ответами:

Конструкторы - C++
У меня есть два конструктора: первый по умолчанию Circle() //Конструктор по умолчанию (инициализирует переменные) { itsRadius =...

Конструкторы - C++
Есть фрагмент кода: #include &lt;iostream&gt; using namespace std; class Counter { public: Counter operator++(int);...

конструкторы - C++
Есть 2 проблемы: 1) Сказали сделать 2 конструктора: один по умолчанию, а другой-с параметрами. Какие должны быть параметры в моем...

конструкторы - C++
Доброе время суток! Помогите разобраться с конструктором. Что это такое и с чем его едят. Так как сдала лабу преподавателю, ну вроде ж...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.12.2011, 21:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru