Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для Tanya228
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 98

Конструктор класса

15.04.2017, 21:46. Показов 4536. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для чего используется второй конструктор, если при объявлении полей класса и так указывается их тип?
C++
1
2
3
4
5
6
7
8
9
10
11
class fraction
    {
    private:
        int numerator;
        int denominator;
    public:
        fraction () : numerator (0), denominator (0)
        {}
        
        fraction (int n, int d) : numerator (n), denominator (d)
        {}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2017, 21:46
Ответы с готовыми решениями:

Конструктор класса не видит конструктор по умолчанию другого класса
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this->iType_act = iType_activation_funk; switch...

Конструктор производного класса требует конструктор предка
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...

33
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
17.04.2017, 17:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от MrGluck Посмотреть сообщение
В общем случае да, но в конкретном примере с int это преобразованием типов. У примитивных типов вроде int нет конструктора.
Вот вот, я и пытаюсь понять в какой момент в стандарте указана эта поблажка для фундаментальных типов) Сам понимаю, что нету там конструкторов и деструкторов, и конструкторов по умолчанию с значением ноль, а то бы С++ был по производительности хуже в разы
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
17.04.2017, 17:56
C++
1
2
    int x(int,int,int);
    int y = (int,int,int) 100;
Добавлено через 7 минут
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Для методов думаю понятно и объяснять не надо почему параметры по умол зло
И для шаблонов зло, и современные возможности инициализировать прямо в классе (ибо место им в реализации) тоже зло?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.04.2017, 18:03
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Числа 1 и 200 это значения реализации
конструктор задает механизму какие то стартовые настройки.
это - часть интерфейса управления,
а не деталь реализации.

C++
1
2
3
// юзер видит какие есть стартовые настройки
// и какие они будут по умолчанию
car(fuel = 100.0, speed = 360);
C++
1
2
3
4
5
// перетащили параметры по умолчанию
// в реализацию
car(); // какие теперь стартовые настройки машинки?
// предлагаете юзеру залезть в спп
// что бы узнать дефолтное состояние?
ну и самое главное - параметры по умолчанию
нужны исключительно для удобства пользования.
наиболее актуально-востребованные
что бы не писать каждый раз лишних буковок

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Свойство класса не лечит от "мусора"
не осилил эту фразу.


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

так что можно смело полагать,
что у примитивов их целых четыре:
неявный дефолтный:
C++
1
int a;
конструктор с параметром:

C++
1
int a(10);
явный дефолтный:
C++
1
int();
и конструктор копии:
C++
1
int a = int(10);
однако формально,
стандарт говорит,

что дефолтного конструктора у примитивов нет.
это нужно понимать так:
память останется не инициализированной.

так же, стандарт говорит,
что у примитивов вообще нет конструктора.

вообще, что такое "конструктор" ?
это некоторая специальная функция,
которая вызывается для того,
что бы проинициализировать память
неким осмысленным содержимым.

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

а вышеозначенные синтаксические записи
не более чем фикция,
которая имитирует поведение схожее с реальными конструкторами классов.

однако, на практике,
вот именно с точки зрения логики происходящего в программном коде,
особенно это хорошо заметно на шаблонах:
C++
1
2
3
4
T value = T(); //<--- логика отработает именно так, как ожидается для любого T,
// который имеет дефолтный конструктор,
// и умеет неявное приведение
// и пофиг, примитив там, или класс
я пришел к выводу,
что можно считать синтаксис инициализации примитивов вполне себе конструкторами.
потому что на практике разницы между:
"вызвали конструктор с параметром для инта",
и "выполнили синтаксическую конструкцию языка"
нет никакой абсолютно.

а те, кто с пеной у рта доказывают, что конструкторов у них нет,
с ссылкой на стандарт, имхо - просто зануды.

пусть они это шаблонам языка доказывают.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
17.04.2017, 18:09
Цитата Сообщение от daslex Посмотреть сообщение
И для шаблонов зло, и современные возможности инициализировать прямо в классе (ибо место им в реализации) тоже зло?
видите, вы начали понимать меня)))

1) я не сталкивался с тем, когда у шаблона надо указать значение по умолчанию иначе я умру или пальцы умрут печатать тип для читабельности явно
2) с болью в сердце, иногда использую, но только в случаи с структурами так как тыц
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.04.2017, 18:09
Цитата Сообщение от DevAlone Посмотреть сообщение
это преобразование типов, равносильно (int)3
преобразование типов по значению,
есть запуск конструктора копии.

Цитата Сообщение от DevAlone Посмотреть сообщение
а это синтаксис инициализации
вот это тоже "синтаксис инициализации"

C++
1
someClass obj("ololo");
осталось лишь осознать,
что между "синтаксисом инициализации",
и "синтаксисом, который описывает запуск конструктора"
на практике разницы нет никакой.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.04.2017, 18:18
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
T(x) это конструктор.
Или приведение в функциональном стиле.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{};
 
class B
{
public:
    operator A() { return A(); }
};
 
int main()
{
    B b;
    A a = A(b);
}
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
17.04.2017, 18:27
Цитата Сообщение от hoggy Посмотреть сообщение
это - часть интерфейса управления,
а не деталь реализации.
Зачем клиенту или клиентскому классу литерал 200, если он его НИКАК не
может использовать или прочитать, но при изменении на 198, без
качественной pimpl архитектуре, мы можем идти за чаем.

Цитата Сообщение от hoggy Посмотреть сообщение
// юзер видит какие есть стартовые настройки
// и какие они будут по умолчанию
А если поменяет дядя Петя на 13 и 77 - клиент Коля снова увидит, а
потом Петя снова поменяет - так зачем Коле вообще знать значение
по умолчанию у объявления для всех классов??? Хочет Коля 400 и 500
- пусть всандалит их. Если уверен, что знач по умол его устроят какие
бы они не были - так зачем Пете об этом писать в интерфейсе? Петя
будет полностью прав, если не будет светить реализацией где попало.

Цитата Сообщение от hoggy Посмотреть сообщение
ну и самое главное - параметры по умолчанию
нужны исключительно для удобства пользования.
наиболее актуально-востребованные
что бы не писать каждый раз лишних буковок
Вы знаете, что у меня малый опыт, но и его хватило, чтобы встать на грабли
C++
1
void Foo::fn( Point2D pos, SomeEnum1::A, SomeEnum2::B, SomeEnum3::C );
Если решим, что по умолчанию всё же SomeEnum2::V - ой сколько же
надо побегать по файлам. И давайте вспоминать, что если по умолчанию
таких много - для их контроля лучше применить, что-то такое https://refactoring.com/catalo... bject.html
Каждый случай индивидуальный, так просто про всех не ответишь -
но называть удобство, когда под ноги высыпаешь себе гвозди не классно.
Сегодня ты улыбаешься как классно иметь int size = 50 -
завтра ты плачешь, что что-то "выросло", а что-то должно остаться на 50-и

Цитата Сообщение от hoggy Посмотреть сообщение
не осилил эту фразу.
Перечитал её еще раз, всё верно - значит пропустим её - если не поняли)
Толку мне перенабирать текст)

P.S. Как же приятно спорить с hoggy
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.04.2017, 18:42
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Зачем клиенту или клиентскому классу литерал 200, если он его НИКАК не
может использовать или прочитать, но при изменении на 198, без
качественной pimpl архитектуре, мы можем идти за чаем.
не понял.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А если поменяет дядя Петя на 13 и 77 - клиент Коля снова увидит, а
потом Петя снова поменяет - так зачем Коле вообще знать значение
по умолчанию у объявления для всех классов???
интерфейс - публичная часть класса.
с тем же самым успехом Петя мог изменить название метода,
или ещё что нибудь.
нельзя просто так брать и менять интерфейс.
меняем интерфейс - код вызывающей стороны летит к черту.

в разработке есть такое понятие "легаси".
знаете, что такое легаси?

Кликните здесь для просмотра всего текста
знаете почему диаметр корпуса первых космических ракет был стандартным,
и именно таким, каков он был, а не каким то иначе?

потому что цилиндрические корпуса для этих ракет доставлялись по железной дороге.
а дорога шла через туннели.
и вот диаметр этих туннелей и задавал ограничение на диаметр корпусов.
а почему диаметр туннелей был именно таким?
потому что их строили во времена, когда строили железную дорогу.
и шпалы для дороги доставляли на двух лошадях,
идущих параллельно друг другу.

вот так и получается, что диаметр космических ракет -
это легаси с двумя конскими задницами.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
17.04.2017, 18:42
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
видите, вы начали понимать меня)))
Я ведь злом не считаю.
Это удобно и в некоторой степени защита от дурака.
К тому же сокращает код. Можно конструкторы не громоздить.
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
31
32
33
34
35
36
37
38
39
#include <iostream>
 
using namespace std;
 
 
class MyClass{
    int num;
    int den;
    const char *pch{};
public:
    MyClass(const int n=0, const int d=0, const char* p=0):num(n),den(d),pch(p) {
        cout << num <<' ' << "ctor\n";
 
    }
 
    void foo(){
        cout << num << den << '\n';
    }
 
    void foo2(){
        cout << *pch << '\n';
    }
};
 
class Temp{
    int x;
public:
    Temp(){
        cout << x << '\n';
    }
};
 
int main(){
 MyClass x1, x2(100), x3(200,300), x4(400,500,"LLL"); //Чтобы объявить первый х, задумываться о том, что
                                                      //его инициализировать не надо
                                                      //Да и многие STL-контейнеры того же мнения
 
 Temp obj; //Здесь хлам
}
В минус может пойти только тот факт, что если человек на подсказки IDE надеется больше чем нужно, то лишний параметр в конструкторе может его сбивать с панталыку.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
17.04.2017, 18:45
Цитата Сообщение от hoggy Посмотреть сообщение
это преобразование типов, равносильно (int)3
преобразование типов по значению,
есть запуск конструктора копии.
Нету у int'а никакого конструктора копий.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.04.2017, 18:48
Цитата Сообщение от DevAlone Посмотреть сообщение
Нету у int'а никакого конструктора копий.
см #23
особенное внимание обратите на заключительную часть.
0
17.04.2017, 18:49

Не по теме:

del

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
17.04.2017, 18:50
Цитата Сообщение от daslex Посмотреть сообщение
//Чтобы объявить первый х, задумываться о том, что
//его инициализировать не надо
//Да и многие STL-контейнеры того же мнения
Мы сейчас спорим, что не надо обнулять поля класса? Или о том, что тремя конструкторами с разным количеством параметров и делигированием вашу проблему в примере никак не решить?

Цитата Сообщение от DevAlone Посмотреть сообщение
Нету у int'а никакого конструктора копий
Опа нашли зануду
Кликните здесь для просмотра всего текста
Без обид, просто hoggy ожидал ваш пост
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
17.04.2017, 19:01
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что не надо обнулять поля класса?
Это вопрос не обнуления, а использование возможности языка для инициализации.
И причин протестовать этому не вижу.
Вы же протестуете зачем-то.

Мою проблему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2017, 19:01

Конструктор внутри класса, поля которого являются членами другого класса
Вот фрагмент кода. class Class_Figure { Class_Triangle tr1; Class_Circle cr1; public: Class_Figure() { } void...

Вызвать конструктор производного класса без конструктора базового класса
Здравствуйте! У меня есть базовый класс треугольник и производный класс равносторонний треугольник.В конструкторе треугольника вводятся...

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка. Всем огромное спасибо за помощь! |

В конструктор класса передать объект этого класса
Вопрос на засыпку :) Как в конструктор класса передать объект этого класса? Т.е. class A { public: A(const char* s){} ...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru