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

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

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

Конструкторы C++
конструкторы C++
C++ конструкторы
C++ Заменить конструкторы на конструктор по умолчанию
Конструкторы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
29.12.2011, 20:08     Конструкторы по умолчанию. #2
Код в студию.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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;
}
soon
 Аватар для soon
2536 / 1301 / 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]
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
29.12.2011, 20:34  [ТС]     Конструкторы по умолчанию. #5
Странно, но я ничего не отключал. Стоит debug конфигурация, никаких warning не было.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 20:35     Конструкторы по умолчанию. #6
Пример входных, выходных, и желаемых выходных данных предоставте пожалуйста.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
29.12.2011, 20:36     Конструкторы по умолчанию. #7
А откуда нам знать откуда берётся "blabla"?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да код не принципиален
Это не факт.
+
У вас названо 3 конструктора, вы и выложите оригинал, от строки до строки. Не выкладывайте только остальные функции (мэйн выложите)
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.12.2011, 20:38     Конструкторы по умолчанию. #8
Цитата Сообщение от soon Посмотреть сообщение
Патамушта варнинги отключать не надо.
http://codepad.org/OTvRWPbE
Какие?
soon
 Аватар для soon
2536 / 1301 / 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$
Проверьте, с какими параметрами среда компилирует проект
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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;
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:39     Конструкторы по умолчанию. #11
Цитата Сообщение от go Посмотреть сообщение
Какие?
Из первого сообщения ТС, там надо было еще
C++
1
2
digit d();
std::cout << d << std::endl;
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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? И мне все таки интересно, чем отличается инициализация с пустыми скобками и без скобок.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:58     Конструкторы по умолчанию. #13
Toshkarik, добавьте в параметры компиляции -Wall

Добавлено через 5 минут
На Waddress выдает варнинги как ошибки. В принципе, кому как больше нравится.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
29.12.2011, 20:58  [ТС]     Конструкторы по умолчанию. #14
Спасибо, добавил. Так в чем проблема данной инициализации? Может где нибудь написано про это?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 21:35     Конструкторы по умолчанию. #15
Цитата Сообщение от Toshkarik Посмотреть сообщение
Может где нибудь написано про это
Стандарт штудирую. Советую присоединится, полагаю копать надо в сторону главы 8.5 Initializer или 8.4 Function
Если попытаться вывести адрес int a(), то выдаст 1. Так, между словом.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
29.12.2011, 21:41     Конструкторы по умолчанию. #16
А функцией trace into нельзя проверить какой конструктор вызывается чтоли?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 21:52     Конструкторы по умолчанию. #17
В общем, в стандарте указано, что при вызове X a() не создается объект класса Х, но создается функция, которой ничего не передается, и которая возвращает X(перевод - "..and returning an X"). Поэтому я предполагаю, что возвращается некое подобие указателя(если не сам указатель) на класс Х с адресом true. Повторяю, это только предположение.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
29.12.2011, 21:57     Конструкторы по умолчанию. #18
Цитата Сообщение от dimcoder Посмотреть сообщение
А функцией trace into нельзя проверить какой конструктор вызывается чтоли?
суть не в этом.
Товарищи ждут когда им предоставит цитату из стандарта.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
29.12.2011, 22:50  [ТС]     Конструкторы по умолчанию. #19
Ну я так и предпологал, что создается что то вроде функции, спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2011, 22:58     Конструкторы по умолчанию.
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 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/ Привел только те участки, которые различались.
Yandex
Объявления
29.12.2011, 22:58     Конструкторы по умолчанию.
Ответ Создать тему
Опции темы

Текущее время: 20:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru