С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/65: Рейтинг темы: голосов - 65, средняя оценка - 4.78
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238

Что возвращает конструктор?

31.10.2019, 23:35. Показов 12730. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что возвращает конструктор?
Читал что если написать myclass() ; (myclass это созданный класс), то создаётся безымянный объект, но как-то странно звучит, если это правда можно подробнее?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2019, 23:35
Ответы с готовыми решениями:

Что возвращает конструктор?
Здравствуйте! Я не могу понять, как происходит присвоение вот здесь: object obj = object(10) object - класс, написанный программистом....

Конструктор Shader() возвращает null
Камрады, разве следующий код должен вернуть null ? (Unity 5.6) Shader sh = new Shader();

Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор
Создать класс «матрица». Данный класс должен содержать элементы типа int, определяющие число строк, столбцов и состояние ошибки. Определить...

69
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.11.2019, 21:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Undisputed Посмотреть сообщение
IGPIGP, IGPIGP,
Выше ведь я привёл код, на rextester. Можете раскомментировать конструктор и скомпилировать
Undisputed, Undisputed вы не поняли что я хотел вам сказать. Если вы определили хотя бы один конструктор и у вас нет конструктора по умолчанию, то у вас нет конструктора по умолчанию. Это из другой оперы. Я привел код, где ктор который имеет один параметр со значением по умолчанию
C++
1
Struct(int a_=123):a(a_){ cout<<"\nStruct()\n";}
Он работает и я о нём говорил.

Добавлено через 5 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Доказать такое утверждение - тривиальнейшая задача, ибо это базовые факты из спецификации языка. "Подозревать" вы можете сколько угодно, но поведение процесса инициализации подробно специфицировано в соответствующих разделах стандарта языка. Тут ничего не нужно "доказывать".
Вы можете доказать на конкретном компиляторе, что он реализует данную спецификацию? Я верю что она присутствует.
TheCalligrapher, я преклоняюсь перед вашими знаниями, но некоторая категоричность слегка смущает. То есть, "...совершенно ни какого отношения не имеет...", "совершенно неверно" ... Совершенство вещь недостижимая. Но я вас понял. Спасибо.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
01.11.2019, 22:07
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В этом случае была выполнена value-инициализация без участия конструктора
назревает вопрос, для чего нужен неявный конструктор по умолчанию, кроме как вызывать таких же бесполезных не явных конструкторов по умолчанию базового класса?, или неявный конструктор по умолчанию заполняет только какие то служебные структуры, виртуальные таблицы и т.д?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
01.11.2019, 22:17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы можете доказать на конкретном компиляторе, что он реализует данную спецификацию?
Это как это?

Какой компилятор С++ ни возьми, какое поведение ни рассмотри, всегда можно будет сказать: "Я не верю, что этот компилятор реализует стандарт языка С++. Я верю, что на самом деле внутри компилятора бегают инопланетные зеленые гномики, которые все делают по-своему, а на стандарт им глубоко плевать. Да, внешнее поведение совпадает со стандартным, но внутри эти гномики все сделали по-своему. У них там не только конструкторы есть, но и шмустракторы, и кергукторы. Я в это верю."

Каким образом вы мне предлагаете доказывать, что это не так? Это невозможно доказать. Более того, вполне возможно, что внутри какого-то компилятора действительно бегают зеленые гномики с шмустракторами и кергукторами. И такой компилятор даже будет конформным, если внешнее поведение сгенерированного им кода соответствует стандарту языка.

Но к чему это здесь? Мы здесь говорим не о том, как ведут себя воображаемые инопланетные компиляторы, а о языке С++ как таковом. Что там творится внутри компиляторов - не имеет никакого значения и к теме никак не относится.

Цитата Сообщение от IGPIGP Посмотреть сообщение
некоторая категоричность слегка смущает
Это не моя категоричность. Это формальная категоричность спецификации языка. И направлена эта категоричность исключительно на теории о зеленых гномиках. Просто потому, что они тут совершенно не нужны.

Добавлено через 6 минут
Цитата Сообщение от _stanislav Посмотреть сообщение
назревает вопрос, для чего нужен неявный конструктор по умолчанию, кроме как вызывать таких же бесполезных не явных конструкторов по умолчанию базового класса?, или неявный конструктор по умолчанию заполняет только какие то служебные структуры, виртуальные таблицы и т.д?
Ну как вы сами знаете, в С++ испокон веков существует архиважный водораздел между тривиальными классами типа POD (plain old data, выражаясь устаревшей терминологией), и "нетривиальными" классами (с виртуальными методами, нетривиальными полями и/или базами и т.п.)

В POD классах, являющихся фактически аналогом голых сишных структур, конструктор по умолчанию тривиален, т.е. существует чисто концептуально. Он ничего не делает и никакого кода не порождает. Физически его не существует. А номинальное его существование нужно лишь для упрощения формального изложения в тексте стандарта языка. Текст становится намного проще.

А как только речь заходит о "нетривиальных" классах, то вы сами уже ответили на свой вопрос: да, неявный конструктор будет вызывать конструкторы баз и полей класса (которые не обязательно "бесполезны"), а также выполнять такие внутренние инициализации, как инициализация указателя на VMT.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
02.11.2019, 11:56
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В POD классах, являющихся фактически аналогом голых сишных структур, конструктор по умолчанию тривиален, т.е. существует чисто концептуально. Он ничего не делает и никакого кода не порождает. Физически его не существует. А номинальное его существование нужно лишь для упрощения формального изложения в тексте стандарта языка. Текст становится намного проще.
конкретней, он нужен что бы можно было инициализировать вектора и массивы?, потому что компилятору нужно его дернуть, перед созданием объекта, он конечно может этого и не делать (в отношениях pod), но по стандарту наверное должен? (это про гномиков зеленых)
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
02.11.2019, 13:21  [ТС]
IGPIGP,
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Struct
{
 Struct(){cout<<"\nStruct()\n";}
 Struct &operator=(const Struct &rhs)
 {
 cout<<"\nStruct &operator(const Struct &rhs)\n";
 return *this;
 }
 Struct(const Struct &rhs){cout<<"\n Struct(const Struct &rhs)\n";}
};
int main()
{
 Struct st=Struct();
 
//Struct st;
}
Struct st = Struct(); ничего не вызывает кроме конструктора ,потому что это аналогично Struct st()?
если сделать вот так :
C++
1
2
Struct st;
st = Struct(); то тут уже все понятно раюотает, создается анонимный объект и прирывнивается
Добавлено через 1 минуту
TheCalligrapher,
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Несмотря на то, что у класса S есть неявные конструкторы, в выражениях S() и S{ 1, 2 } они никак не задействованы.
как объекты могут создаваться без участи конструкторов?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
02.11.2019, 13:21
Цитата Сообщение от Vanconts Посмотреть сообщение
Struct st()
Это объявление функции.
Цитата Сообщение от Vanconts Посмотреть сообщение
ничего не вызывает кроме конструктора ,потому что это
Одна из форм инициализации в которой лишнее копирование отбрасывается.
Это если совсем по колхозному.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2019, 13:46
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какой компилятор С++ ни возьми, какое поведение ни рассмотри, всегда можно будет сказать: "Я не верю, что этот компилятор реализует стандарт языка С++.
Есть вещи в которые не нужно верить, - их можно логировать или на экран вывести. Далее опять же согласен. Все компиляторы реализуют стандарт неукоснительно. Про зелёных человечков - логично. Улыбнули)
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это невозможно доказать.
Я об этом и говорю.
Цитата Сообщение от Vanconts Посмотреть сообщение
Struct st()?
нет. Croessmah, сказал об этом.
Цитата Сообщение от Vanconts Посмотреть сообщение
Struct st = Struct(); ничего не вызывает кроме конструктора ,потому что
"Потому что" - ключевое словосочетание. Существует куча вещей которые могут называться как copy elision, RVO и пр. вещи которые были реализованы ещё до move. Пока что вам было бы достаточно (имхо) осознать, что такое "потому что" избавляет компилятор от генерации ненужного кода, а систему от его выполнения. В С++ много хвостов связанных с приемственностью (начиная от С и далее, - от версии к версии), которые позволено писать. И не всегда это приятно. Недавно я сам подорвался на том, что использовал std::lower_bound на контейнере, где он не работает как нужно (но работает - гадость такая), а его мембер-функшн set::lower_bound работает именно так как нужно. И никуто не запретил компилировать плохой вариант. Или факт того что кастомные new/delete -статические методы, но можно объявлять как нестатические. И их подпольноя виртуальность. Язык изобилует чудесными местами. Сначала нужно их заметить. Потом запомнить. И в применении и чтении разных источников понять механизм. Хотя некоторые и без этого неплохо обходятся в самых трудных для понимания местах.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
02.11.2019, 14:09  [ТС]
IGPIGP, почему если у нас есть конструктор типа Struct() и Struct(int a) то в первом случае я не могу создать объект Struct obj(), а во втором могу Struct obj(5)?

Добавлено через 2 минуты
Croessmah, а зачем такую форму вообще разрешили? Она используется в каких-то определённых ситуациях в которых обычная Struct obj; не подойдёт?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.11.2019, 15:37
Vanconts,
Почитайте про прототипы функций и попробуйте ответить на вопрос:
Struct obj(); это прототип или создание обьекта типа Struct.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
02.11.2019, 16:00  [ТС]
Undisputed, прочитал и да, действительно, это прототип функции, теперь я понимаю, Вы не знаете случаем для чего нужна форма Class obj = Class()?

Добавлено через 26 секунд
Undisputed, и как объекты создаются без участи конструкторов?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.11.2019, 16:38
Цитата Сообщение от Vanconts Посмотреть сообщение
Вы не знаете случаем для чего нужна форма Class obj = Class()?
Так вы просто создадите временный объект типа Class а затем сконструируете на основе этого временного объекта новый объект (копию временного) obj. Но компиляторы как правило оптимизируют такие выражения и копии создаваться не будет. Потому что
Смысла именно так инициализировать особо нет.
Объект типа Class будет сконструирован напрямую в obj. Для проверки можно скомпилировать код
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
struct foo
{
    foo(){std::cout << "Created\n";}
    foo(const foo&){std::cout << "Created copy\n";}
};
 
int main()
{
    foo f = foo();
}
на gcc с флагом -fno-elide-constructors и без него. в первом случае сработает конструктор копирования, во втором - нет.
1) https://rextester.com/SXCO19846
2) https://rextester.com/POS25155

Цитата Сообщение от Vanconts Посмотреть сообщение
и как объекты создаются без участи конструкторов?
конструктор это всего лишь часть процесса инициализации
если инициализация прошла успешно - значит объект сформирован
в некоторых случаях как вот тут
Что возвращает конструктор?
вызов конструктора для успешной инициализации не требуется

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

Добавлено через 1 минуту
поэтому не нужно удивляться тому что объекты могут быть сформированы без участия конструкторов
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2019, 16:39
del
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
02.11.2019, 16:46  [ТС]
Undisputed, как называется эта тема с инициализации? Хочу почитать
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
02.11.2019, 16:51
Vanconts,
это большая тема т.к есть разные виды инициализации и зависимости от того что именно вам нужно тема может называться по разному.
https://habr.com/ru/company/jugru/blog/469465/
вот здесь можете почитать по поводу инициализаций
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
02.11.2019, 16:56
Цитата Сообщение от Vanconts Посмотреть сообщение
как называется эта тема с инициализации? Хочу почитать
это называется научиться читать стандарт и начать писать свой компилятор. по моему ты слишком в дебри лезешь для новичка, нужно уметь абстрагироваться от деталей, по себе знаю.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
02.11.2019, 17:24  [ТС]
_stanislav, Тоесть мне лучше пока тчо просто понять что Struct st = Struct() это равносильно Struct st и пока что дальше не лезть?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
02.11.2019, 17:36
Цитата Сообщение от Vanconts Посмотреть сообщение
это равносильно Struct st и пока что дальше не лезть?
думаю да
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
02.11.2019, 19:10
Цитата Сообщение от Vanconts Посмотреть сообщение
TheCalligrapher,
как объекты могут создаваться без участи конструкторов?
??? На третей страницы темы вы вдруг решили задать вопрос, который разжевывался три станицы?

Объекты без участия конструктора создаются так, как написано в стандарте языка. В стандарте языка описывается масса способов инициализации без участия конструктора. Я привел явный пример в сообщении номер 36:

https://www.cyberforum.ru/post13955891.html

в котором, в частности, используется агрегатная инициализация и value-инициализация, которая в данном случае не использует конструкторов.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2019, 19:16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Объекты без участия конструктора создаются так
TheCalligrapher, я написал простой класс и провел uniform initialization одного объекта. MinGW64 release. Интересно, что размер кода не изменился когда я добавил конструктор с параметром.
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
#include <iostream>
#include <string>
using namespace std;
struct TestHaveCtorOrNot
{
  string  s;
  // exe 785 kb
  //if uncomment next string the size of exe file remains 785 kb
  //TestHaveCtorOrNot(const char* c_string):s(c_string){}
};
 
int main()
{
TestHaveCtorOrNot tst
{
//(
    " Strings are objects that represent sequences of characters.\
The standard string class provides support for such objects with an interface\
 similar to that of a standard container of bytes, but adding features specifically\
 designed to operate with strings of single-byte characters.\
The string class is an instantiation of the basic_string class \
template that uses char (i.e., bytes) as its character type, with\
 its default char_traits and allocator types (see basic_string for\
 more info on the template).\
Note that this class handles bytes independently of the encoding\
 used: If used to handle sequences of multi-byte or variable-length\
  characters (such as UTF-8), all members of this class (such as\
 length or size), as well as its iterators, will still operate in\
 terms of bytes (not actual encoded characters)."
//)
}
//nothing changes when {} to () changed in a mode with defined default ctor
;
cout<<tst.s<<endl;
    return 0;
}
То есть код должен быть одинаков, хотя побитово я не сравнивал файлы) Может я не то делаю?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
02.11.2019, 19:40
Цитата Сообщение от IGPIGP Посмотреть сообщение
Интересно, что размер кода не изменился когда я добавил конструктор с параметром.
Это говорит лишь о том, что бесконструкторная агрегатная инициализация, которая выполняется в исходном варианте кода, порождает в итоге точно такой же код, как и вариант с явным конструктором. Поэтому ничего и не изменилось. То есть ничего примечательного в том, что "размер кода не изменился" нет. Мне совершенно не понятно, что и как вы собирались протестировать этим кодом и почему вы ожидали, что даст вам возможность что-то продемонстрировать.

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

Цитата Сообщение от IGPIGP Посмотреть сообщение
Может я не то делаю?
У вас наблюдаются какие-то странные ожидания того, что абстрактные, чисто концептуальные различия в поведении кода выльются в разный сгенерированный код. С чего бы это вдруг?

Вот таком коде

C++
1
2
3
4
5
S a = { 42, 123 };
 
S b;
b.x = 42;
b.y = 123;
содержится масса бросающихся в глаза абстрактных концептуальных различий между способами "инициализации" a и b. Но никого, надеюсь, не удивит, если код в обоих случаях компилятор сгенерирует одинаковый? Наоборот, все скорее ожидают одинакового кода в таких случаях.

Почему же вы ожидаете каких-то отличий в ваших вариантах?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2019, 19:40
Помогаю со студенческими работами здесь

Что можно сделать, что бы конструктор вызывался один раз при агрегировании?
Добрый день. Написал код, но два раза подряд вызывается конструктор, так как создаю объект в другом классе.. Что можно сделать, что бы...

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

Что означает запись в скобках и что возвращает return
Всем привет! Начал читать книгу BecomeAnXcoder и тут появился вопрос. В пример приведен такой код circleArea(float theRadius) //(1) ...

Что тут метод, а что конструктор?
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp77 { class...

Что делает конструктор?
Я очень плохо понял вобще. Он вроде помогает создать в памяти место для переменных обьявленых в классе?? В каких слуаях его лучше...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru