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

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

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

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

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

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

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

19
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.12.2011, 20:08
Код в студию.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 20:27  [ТС]
Да код не принципиален. Но вот к примеру такой.
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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:32
Цитата Сообщение от Toshkarik Посмотреть сообщение
Откуда берется единица?
Патамушта варнинги отключать не надо.
Code
1
main.cpp:40:18: warning: the address of ‘digit d()’ will always evaluate as ‘true’ [-Waddress]
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 20:34  [ТС]
Странно, но я ничего не отключал. Стоит debug конфигурация, никаких warning не было.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.12.2011, 20:35
Пример входных, выходных, и желаемых выходных данных предоставте пожалуйста.
0
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.12.2011, 20:36
А откуда нам знать откуда берётся "blabla"?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да код не принципиален
Это не факт.
+
У вас названо 3 конструктора, вы и выложите оригинал, от строки до строки. Не выкладывайте только остальные функции (мэйн выложите)
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
29.12.2011, 20:38
Цитата Сообщение от soon Посмотреть сообщение
Патамушта варнинги отключать не надо.
http://codepad.org/OTvRWPbE
Какие?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:38
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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 20:39  [ТС]
Я же написал в первом сообщение, данные не важны. Конструктор по умолчанию инициализирует нулем. Вот пример использования:
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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:39
Цитата Сообщение от go Посмотреть сообщение
Какие?
Из первого сообщения ТС, там надо было еще
C++
1
2
digit d();
std::cout << d << std::endl;
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 20:52  [ТС]
Вот лог построения
Лог
"/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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 20:58
Toshkarik, добавьте в параметры компиляции -Wall

Добавлено через 5 минут
На Waddress выдает варнинги как ошибки. В принципе, кому как больше нравится.
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 20:58  [ТС]
Спасибо, добавил. Так в чем проблема данной инициализации? Может где нибудь написано про это?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 21:35
Цитата Сообщение от Toshkarik Посмотреть сообщение
Может где нибудь написано про это
Стандарт штудирую. Советую присоединится, полагаю копать надо в сторону главы 8.5 Initializer или 8.4 Function
Если попытаться вывести адрес int a(), то выдаст 1. Так, между словом.
0
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.12.2011, 21:41
А функцией trace into нельзя проверить какой конструктор вызывается чтоли?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 21:52
В общем, в стандарте указано, что при вызове X a() не создается объект класса Х, но создается функция, которой ничего не передается, и которая возвращает X(перевод - "..and returning an X"). Поэтому я предполагаю, что возвращается некое подобие указателя(если не сам указатель) на класс Х с адресом true. Повторяю, это только предположение.
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
29.12.2011, 21:57
Цитата Сообщение от dimcoder Посмотреть сообщение
А функцией trace into нельзя проверить какой конструктор вызывается чтоли?
суть не в этом.
Товарищи ждут когда им предоставит цитату из стандарта.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.12.2011, 22:50  [ТС]
Ну я так и предпологал, что создается что то вроде функции, спасибо.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.12.2011, 22:58
После перевода 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2011, 22:58
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru