Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/43: Рейтинг темы: голосов - 43, средняя оценка - 4.86
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
1

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

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

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

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

Конструкторы. Почему-то по умолчанию и копирующий не срабатывают, помогите найти ошибку.
Написал небольшой код, для понимания, как работают различные варианты конструкторов (т.е. по...

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

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

19
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.12.2011, 20:08 2
Код в студию.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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
2554 / 1319 / 178
Регистрация: 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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 20:34  [ТС] 5
Странно, но я ничего не отключал. Стоит debug конфигурация, никаких warning не было.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.12.2011, 20:35 6
Пример входных, выходных, и желаемых выходных данных предоставте пожалуйста.
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.12.2011, 20:36 7
А откуда нам знать откуда берётся "blabla"?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да код не принципиален
Это не факт.
+
У вас названо 3 конструктора, вы и выложите оригинал, от строки до строки. Не выкладывайте только остальные функции (мэйн выложите)
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.12.2011, 20:38 8
Цитата Сообщение от soon Посмотреть сообщение
Патамушта варнинги отключать не надо.
http://codepad.org/OTvRWPbE
Какие?
0
2554 / 1319 / 178
Регистрация: 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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:39 11
Цитата Сообщение от go Посмотреть сообщение
Какие?
Из первого сообщения ТС, там надо было еще
C++
1
2
digit d();
std::cout << d << std::endl;
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:58 13
Toshkarik, добавьте в параметры компиляции -Wall

Добавлено через 5 минут
На Waddress выдает варнинги как ошибки. В принципе, кому как больше нравится.
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 20:58  [ТС] 14
Спасибо, добавил. Так в чем проблема данной инициализации? Может где нибудь написано про это?
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 21:35 15
Цитата Сообщение от Toshkarik Посмотреть сообщение
Может где нибудь написано про это
Стандарт штудирую. Советую присоединится, полагаю копать надо в сторону главы 8.5 Initializer или 8.4 Function
Если попытаться вывести адрес int a(), то выдаст 1. Так, между словом.
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.12.2011, 21:41 16
А функцией trace into нельзя проверить какой конструктор вызывается чтоли?
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 21:52 17
В общем, в стандарте указано, что при вызове X a() не создается объект класса Х, но создается функция, которой ничего не передается, и которая возвращает X(перевод - "..and returning an X"). Поэтому я предполагаю, что возвращается некое подобие указателя(если не сам указатель) на класс Х с адресом true. Повторяю, это только предположение.
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
29.12.2011, 21:57 18
Цитата Сообщение от dimcoder Посмотреть сообщение
А функцией trace into нельзя проверить какой конструктор вызывается чтоли?
суть не в этом.
Товарищи ждут когда им предоставит цитату из стандарта.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 22:50  [ТС] 19
Ну я так и предпологал, что создается что то вроде функции, спасибо.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 22:58 20
После перевода c++ в asm получилось следующее
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    int *a;
    std::cout << a;
    return 0;
}
Assembler
1
2
3
4
5
6
subl    $32, %esp   
movl    28(%esp), %eax 
movl    %eax, 4(%esp)
movl    $_ZSt4cout, (%esp)
call    _ZNSolsEPKv
movl    $0, %eax
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    int a();
    std::cout << a;
    return 0;
}
Assembler
1
2
3
4
5
subl    $16, %esp
movl    $1, 4(%esp)
movl    $_ZSt4cout, (%esp)
call    _ZNSolsEb
movl    $0, %eax
Ну, ч.т.д. В первом коде сначала в eax пишется (esp + 28), затем в (esp + 4) пишется eax, и, по видимому, выводится. Во втором сразу на (esp + 4) пишется 1 и выводится.
А в стандарте я, к своему стыду, ничего внятного не нашел. Может плохо искал.
ps/ Привел только те участки, которые различались.
1
29.12.2011, 22:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2011, 22:58
Помогаю со студенческими работами здесь

Webpack собирает проект, а приложение говорит что мои конструкторы не конструкторы
Помогите пожалуйста, в едином файле (не билде) всё работает хорошо, как только начинаю отделять...

Определите класс матриц. Напишите перегруженные конструкторы для создания одномерной и двумерной матриц. В конструкторы передаются размерности матриц
Доброго времени суток всем) Извините если не в том разделе) Не могу понять как решить данную...

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

Конструкторы базовых классов ("Производный класс не наследует конструкторы базовых классов")
Как следует понимать выражение &quot;Производный класс не наследует конструкторы базовых классов&quot;, если...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru