Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 26.06.2015
Сообщений: 15

Что такое конструктор?

02.07.2015, 10:35. Показов 3067. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Конструктор - это такие детали , как map , player, enemy.Я правильно понял?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.07.2015, 10:35
Ответы с готовыми решениями:

что такое конструктор?
Обьясните плиз что такое конструктор? Это функция а что она делает и для чего?

Что такое конструктор копий?
Объясните, пожалуйста, на максимально простом языке, чем отличается конструктор от конструктора копий? Может это и одно и то же, хотя...

Что такое конструктор по умолчанию? Как инициализируются данные-члены объекта?
Что такое конструктор по умолчанию? Как инициализируются элементы данных объекта, если класс имеет только неявно определенный...

41
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
02.07.2015, 22:53
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daslex Посмотреть сообщение
Только не можете получить размер массива
Да, но память то доступна для чтения, мы ж с этого начали.

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Размер массива хранится в памяти
Вообще говоря не совсем так. Хранится размер динамически выделенной памяти, размер массива, созданного на стеке, не хранится.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
02.07.2015, 23:03
не помню, чтоб с этого начинал. я начал с того, что все забыли о ТС, потом сказал о том, что ... Но не о памяти, доступной и недоступной для чтения.

А Стандарт дает гарантию, что я могу получать доступ к каждому последующему элементу класса, как у Вас в примере, что данные класса хранятся упорядоченно? Я не спорю сейчас, просто увидел новую для себя синтаксическую конструкцию, хорошо бы еще узнать расшифровку return *(int*)this; и почему это срабатывает.

И еще как оно сработает если в классе указатели, а не int, например указатели на int, каждый из которых указывает на массив. (Я, наверное, и сам посмотреть смогу, но пока буду смотреть, спать завалитесь )
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.07.2015, 00:48
Цитата Сообщение от Kastaneda Посмотреть сообщение
"Порождает" я понимаю как "выделяет под него память и инициализирует", хотя за выделение памяти отвечает компилятор (либо специальная функция, если память выделяется динамически).
во-первых,
я специально использовал слово-сочетание "если утрировать".
я принял допущение, что бы упростить тезис, что бы его смог понять новичок.

во-вторых, то что вы пишите, а конкретно:
я понимаю как "выделяет под него память и инициализирует"
верно, с точки зрения понимания сути процессов,
которые происходят в программе, в момент порождения объекта.

но при этом вы смотрите на вещи с точки зрения работы компилятора,
а не с точки зрения самого языка.

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

пример такой позиции:

"Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему"(ц)Страуструп.
с точки языка, конструктор можно рассматривать,
как функцию, задача которой - построить объект.

результат успешной работы конструктора - это объект.
именно это описывается в исходном коде.


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

Добавлено через 15 минут
Цитата Сообщение от daslex Посмотреть сообщение
Только не можете получить размер массива, имея указатель на его начало и не зная его размера. Или Обойдёте? Размер массива хранится в памяти.
http://rextester.com/OZKD92461

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//Title of this code
//Compiler Version 18.00.21005.1 for x86
 
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // --- информация о размере массива, 
    // и всех его размерностях известна времени компиляции
    // поэтому, нет ни одной причины хранить её в рантайме
    int ar[]={1,2,3};
    
    std::cout<<"size of array = " <<sizeof(ar)
        <<": elements = " << sizeof(ar)/sizeof(ar[0])
        <<'\n';
    
    
    // --- строго говоря, на языке с++ не существует динамических массивов
    // однако, часто так называют динамически 
    // выделяемые непрерывные блоки памяти
    
    size_t count = 10;
    int* dynArr = new int[count];
    
    // --- обратите внимание: 
    // мы не сообщали информацию о количестве элементов
    // тем не менее, компилятор каким то образом узнает эту рантайм информацию
    // как он это делает?
    delete[] dynArr;
    
    // --- стандарт оставляет это на откуп компиляторов
    // поэтому, рецепт получания данных - зависит от платформы.
    // например, для visual studio это можно сделать вот так:
    
    dynArr = new int[count];
    std::cout<<"size of array = " << _msize(dynArr) 
        <<": elements = " << _msize(dynArr) /sizeof(dynArr[0])
        <<'\n';
    
    delete[] dynArr;
    
    // --- ну и напоследок: некоторые ошибочно думают,
    // операция выделения памяти: new int[count];
    // выделяет sizeof(int[count]) памяти
    // это не верно.
    // единственное, что гарантирует стандарт - что её будет не меньше, 
    // чем было затребованно.
    // но реально может быть выделенно больше.
    // поэтому, приведенный выше код определения количества элементов
    // с использовании _msize, либо её аналогами для других платформ
    // теоретически может отработать не верно
}
1
03.07.2015, 08:17

Не по теме:

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

0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2015, 08:26
Voivoid, согласен. А вот я вообще вопроса ТС не понял... Какие такие map, enemy...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.07.2015, 08:34
Цитата Сообщение от hoggy Посмотреть сообщение
потому что семантика фразы "распознается по имени"
явно указывает на наличие этого самого имени.
Отнюдь. Примеры:
- Направление на север распознается по мху на камне. Но мох у камня, а не у севера или направления.
- Утечка газа распознается по запаху. Но сам газ не имеет запаха, запах придается одорантом.
Суть в том, что признак, по которому мы что-то пытаемся распознать может быть косвенным, и по факту не принадлежать распознаваемой сущности.
Цитата Сообщение от hoggy Посмотреть сообщение
стандарт намекает: конструкторы вообще не являются функциями-членами.
И именно по этому глава 12 Стандарта, описывающая в параграфе 12.1 конструкторы, называется Special member functions.
Цитата Сообщение от daslex Посмотреть сообщение
название класса, прописанное в public: и синтаксис его как у функции, то это - конструктор
Конструктор совершенно спокойно может быть и в private, и protected секции.
Синтаксис не допускает указания возвращаемого типа. Уже хотя бы поэтому он не такой как у функции.
Цитата Сообщение от daslex Посмотреть сообщение
Проблема киберфорума в том
Цитата Сообщение от daslex Посмотреть сообщение
что ТС не может понять что такое конструктор.
По причине того, что ТС не хочет открыть учебник и ознакомиться с базовыми понятия языка.
Цитата Сообщение от hoggy Посмотреть сообщение
что бы смотреть на вещи с позиции именно языка,
Вот сразу вспомнилась тема про утечки памяти. Почему-то там ты с этим подходом категорически был не согласен.
Цитата Сообщение от Voivoid Посмотреть сообщение
разного рода оффтопик обсуждения всяко интереснее ...
Однозначно!

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Какие такие map, enemy...
ТС, похоже, из игровой вселенной сюда заглянул. Может и вопрос его к каким-то другим конструкторам относится, а не к C++'ным.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
03.07.2015, 08:59
Цитата Сообщение от Croessmah Посмотреть сообщение
Какие такие map, enemy
Ноги тс растут из вот этой темы: https://www.cyberforum.ru/cpp-... 91411.html
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2015, 09:05
SatanaXIII, а, ну это ж из дебилоидного урока с ютюба код, да?
Тогда всё ясно и утверждение
По причине того, что ТС не хочет открыть учебник и ознакомиться с базовыми понятия языка
is true
0
03.07.2015, 09:11

Не по теме:

Croessmah, откуда такие познания в области дебилоидных уроков с ютуба? :)

0
03.07.2015, 09:16

Не по теме:

Kastaneda, относительно конкретно этого урока, то искал на ютюбе видосики по возможностям sfml в связке с box2d, накнулся на чудо-юдо-урок )))
Что касается других уроков, то у меня даже тема есть Парочка полезных видеоуроков по C++ :D

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
03.07.2015, 10:29
Цитата Сообщение от Tulosba Посмотреть сообщение
и в private
В protected да, в private пример давай, компилируемый.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
03.07.2015, 10:46
Цитата Сообщение от daslex Посмотреть сообщение
В protected да, в private пример давай, компилируемый.
Раз: http://ideone.com/V322hA
Два: http://ideone.com/LVziiV

А может, если подумать, даже еще какой пример найдется
1
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2062 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
03.07.2015, 10:52
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
#include <iostream>
using namespace std;
 
class single {
private:
    single() {}
    single(const single&) {}
    single& operator=(const single&) {}
public:
    static single *instance();
    int run() {
        cout << "hello" << endl;
    }
};
 
single* single::instance() {
    static single self;
    return &self;
}
 
int main() {
    single* ps = single::instance();
    return ps->run();
}
ideone.com/sggcLZ
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2015, 10:55
А может, если подумать, даже еще какой пример найдется
Книга "Библиотека программиста", автора не помню. Там этих примеров вагон.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
03.07.2015, 11:24
Паразитирующий, да. глубоко засевший и никому не доступный?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.07.2015, 12:23
Цитата Сообщение от Tulosba Посмотреть сообщение
Отнюдь. Примеры:
- Направление на север распознается по мху на камне. Но мох у камня, а не у севера или направления.
- Утечка газа распознается по запаху. Но сам газ не имеет запаха, запах придается одорантом.
Суть в том, что признак, по которому мы что-то пытаемся распознать может быть косвенным, и по факту не принадлежать распознаваемой сущности.
но не в данном случае.

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

на самом деле тезис ложный.
и вот почему:
есть принципиальное различие между обозначением типа,
и обозначением имени.

вы не можете использовать тип там, где ожидается имя.
и наоборот: там, где ожидается имя, нельзя использовать тип.

пример:

C++
1
std::bind(&some::method, obj);
здесь:
some - обозначает тип
method - обозначает имя (функции-члена).

где нибудь в шаблонах, мы можем написать:

C++
1
std::bind(&T::method, obj);
в качестве параметра шаблона можно указывать тип, оставляя имя прежним.

но проделать аналогичное с именем функции-члена уже не получится.
C++
1
2
std::bind(&some::TNAME, obj); //<--- нельзя оторвать имя от типа, 
     //и передавать его как обособленный параметр

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

Цитата Сообщение от Tulosba Посмотреть сообщение
Вот сразу вспомнилась тема про утечки памяти. Почему-то там ты с этим подходом категорически был не согласен.
не понятно, с чего вы это взяли, и какова связь с мемликами.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.07.2015, 13:24
Цитата Сообщение от hoggy Посмотреть сообщение
согласно первому предложению получается,
что конструктор распознается по собственному имени.
Может по имени класса? Тогда все встает на свои места.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.07.2015, 14:13
Цитата Сообщение от hoggy Посмотреть сообщение
что конструктор распознается по собственному имени.
"собственному" в исходной цитате (пост #8) не было. Иначе принадлежность была бы очевидна.
Стандарт говорит, что конструктор имени не имеет. Точка.
C++
1
auto obj = T(param); // T - совершенно спокойно может быть функцией
Цитата Сообщение от hoggy Посмотреть сообщение
не понятно, с чего вы это взяли, и какова связь с мемликами.
Не с утечками дело, а с подходом к терминологии. Я и тогда, и сейчас опираюсь на термины языка C++.
Ты же апеллировал к ОС и прочим частным случаям, а сейчас вдруг хочешь "смотреть на вещи с позиции именно языка".
Меня это несколько удивило.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.07.2015, 20:36
Цитата Сообщение от Kastaneda Посмотреть сообщение
Может по имени класса? Тогда все встает на свои места.
в этом случае сама фраза теряет смысл, скатываясь в тавтологию:
"Конструктор распознается по имени класса, которое совпадает с именем самого класса."

что это за ерунда?

если бы Страуструп хотел сказать,
что конструктор распознается по имени класса,
он бы так и написал.



Цитата Сообщение от Tulosba Посмотреть сообщение
"собственному" в исходной цитате (пост #8) не было. Иначе принадлежность была бы очевидна.
да, конечно.

Конструктор распознается по имени, которое совпадает с именем самого класса.
согласно формулировке, конструктор распознается не по имени класса,
а по имени, которое совпадает с именем класса.

то бишь, есть какое то другое имя,
которое совпадает с именем класса.

чьё же ещё это может быть имя,
в контексте обозначения конструктора?

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

Цитата Сообщение от Tulosba Посмотреть сообщение
Стандарт говорит, что конструктор имени не имеет. Точка.
Страуструп с вами не согласен.

Цитата Сообщение от Tulosba Посмотреть сообщение
auto obj = T(param); // T - совершенно спокойно может быть функцией
возможно, я привел не удачный пример.
действительно, в качестве параметра шаблона можно прокинуть имя объекта.
но при этом, приходится указывать его точный тип.
оторвать имя от типа все равно никак не получится.

C++
1
2
3
&T::M; //<--- нельзя сделать шаблон, 
// в который можно будет подставлять отдельно взятое имя M
// здесь только препроцессор спасает

Цитата Сообщение от Tulosba Посмотреть сообщение
а с подходом к терминологии.
мемлик имеет несколько формальных определений в зависимости от.
термины по определению не допускают многозначности.

вывод простой: мемлик - не термин.

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

Цитата Сообщение от Tulosba Посмотреть сообщение
Я и тогда, и сейчас опираюсь на термины языка C++.
в стандарте нигде не сказанно, что есть мемлик.
когда он есть, и когда его нет.


Цитата Сообщение от Tulosba Посмотреть сообщение
Ты же апеллировал к ОС и прочим частным случаям
разумеется.

Цитата Сообщение от Tulosba Посмотреть сообщение
а сейчас вдруг хочешь "смотреть на вещи с позиции именно языка".
Меня это несколько удивило.
с позиции языка:
мемлик - явление, которое не является частью языка.
0
03.07.2015, 20:46

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
а не заниматься буквоедством
Ну что вы, никто тут буквоедством не занимается :D

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

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.

Что такое фиктивный конструктор?
Сабж. function f() {}; //Определить фиктивный конструктор Добавлено через 7 минут а точнее вот эти строки: function f() {};...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru