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

Что такое конструктор? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
surveyor2015
0 / 0 / 0
Регистрация: 26.06.2015
Сообщений: 15
02.07.2015, 10:35     Что такое конструктор? #1
Конструктор - это такие детали , как map , player, enemy.Я правильно понял?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.07.2015, 22:53     Что такое конструктор? #21
Цитата Сообщение от daslex Посмотреть сообщение
Только не можете получить размер массива
Да, но память то доступна для чтения, мы ж с этого начали.

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Размер массива хранится в памяти
Вообще говоря не совсем так. Хранится размер динамически выделенной памяти, размер массива, созданного на стеке, не хранится.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
02.07.2015, 23:03     Что такое конструктор? #22
не помню, чтоб с этого начинал. я начал с того, что все забыли о ТС, потом сказал о том, что ... Но не о памяти, доступной и недоступной для чтения.

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

И еще как оно сработает если в классе указатели, а не int, например указатели на int, каждый из которых указывает на массив. (Я, наверное, и сам посмотреть смогу, но пока буду смотреть, спать завалитесь )
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
03.07.2015, 00:48     Что такое конструктор? #23
Цитата Сообщение от 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, либо её аналогами для других платформ
    // теоретически может отработать не верно
}
Voivoid
03.07.2015, 08:17
  #24

Не по теме:

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

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 08:26     Что такое конструктор? #25
Voivoid, согласен. А вот я вообще вопроса ТС не понял... Какие такие map, enemy...
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.07.2015, 08:34     Что такое конструктор? #26
Цитата Сообщение от hoggy Посмотреть сообщение
потому что семантика фразы "распознается по имени"
явно указывает на наличие этого самого имени.
Отнюдь. Примеры:
- Направление на север распознается по мху на камне. Но мох у камня, а не у севера или направления.
- Утечка газа распознается по запаху. Но сам газ не имеет запаха, запах придается одорантом.
Суть в том, что признак, по которому мы что-то пытаемся распознать может быть косвенным, и по факту не принадлежать распознаваемой сущности.
Цитата Сообщение от hoggy Посмотреть сообщение
стандарт намекает: конструкторы вообще не являются функциями-членами.
И именно по этому глава 12 Стандарта, описывающая в параграфе 12.1 конструкторы, называется Special member functions.
Цитата Сообщение от daslex Посмотреть сообщение
название класса, прописанное в public: и синтаксис его как у функции, то это - конструктор
Конструктор совершенно спокойно может быть и в private, и protected секции.
Синтаксис не допускает указания возвращаемого типа. Уже хотя бы поэтому он не такой как у функции.
Цитата Сообщение от daslex Посмотреть сообщение
Проблема киберфорума в том
Цитата Сообщение от daslex Посмотреть сообщение
что ТС не может понять что такое конструктор.
По причине того, что ТС не хочет открыть учебник и ознакомиться с базовыми понятия языка.
Цитата Сообщение от hoggy Посмотреть сообщение
что бы смотреть на вещи с позиции именно языка,
Вот сразу вспомнилась тема про утечки памяти. Почему-то там ты с этим подходом категорически был не согласен.
Цитата Сообщение от Voivoid Посмотреть сообщение
разного рода оффтопик обсуждения всяко интереснее ...
Однозначно!

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Какие такие map, enemy...
ТС, похоже, из игровой вселенной сюда заглянул. Может и вопрос его к каким-то другим конструкторам относится, а не к C++'ным.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
03.07.2015, 08:59     Что такое конструктор? #27
Цитата Сообщение от Croessmah Посмотреть сообщение
Какие такие map, enemy
Ноги тс растут из вот этой темы: http://www.cyberforum.ru/cpp-beginne...ad1491411.html
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 09:05     Что такое конструктор? #28
SatanaXIII, а, ну это ж из дебилоидного урока с ютюба код, да?
Тогда всё ясно и утверждение
По причине того, что ТС не хочет открыть учебник и ознакомиться с базовыми понятия языка
is true
Kastaneda
03.07.2015, 09:11
  #29

Не по теме:

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

Croessmah
03.07.2015, 09:16
  #30

Не по теме:

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

daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
03.07.2015, 10:29     Что такое конструктор? #31
Цитата Сообщение от Tulosba Посмотреть сообщение
и в private
В protected да, в private пример давай, компилируемый.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
03.07.2015, 10:46     Что такое конструктор? #32
Цитата Сообщение от daslex Посмотреть сообщение
В protected да, в private пример давай, компилируемый.
Раз: http://ideone.com/V322hA
Два: http://ideone.com/LVziiV

А может, если подумать, даже еще какой пример найдется
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
03.07.2015, 10:52     Что такое конструктор? #33
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
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 10:55     Что такое конструктор? #34
А может, если подумать, даже еще какой пример найдется
Книга "Библиотека программиста", автора не помню. Там этих примеров вагон.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
03.07.2015, 11:24     Что такое конструктор? #35
Паразитирующий, да. глубоко засевший и никому не доступный?
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
03.07.2015, 12:23     Что такое конструктор? #36
Цитата Сообщение от 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 Посмотреть сообщение
Вот сразу вспомнилась тема про утечки памяти. Почему-то там ты с этим подходом категорически был не согласен.
не понятно, с чего вы это взяли, и какова связь с мемликами.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.07.2015, 13:24     Что такое конструктор? #37
Цитата Сообщение от hoggy Посмотреть сообщение
согласно первому предложению получается,
что конструктор распознается по собственному имени.
Может по имени класса? Тогда все встает на свои места.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.07.2015, 14:13     Что такое конструктор? #38
Цитата Сообщение от hoggy Посмотреть сообщение
что конструктор распознается по собственному имени.
"собственному" в исходной цитате (пост #8) не было. Иначе принадлежность была бы очевидна.
Стандарт говорит, что конструктор имени не имеет. Точка.
C++
1
auto obj = T(param); // T - совершенно спокойно может быть функцией
Цитата Сообщение от hoggy Посмотреть сообщение
не понятно, с чего вы это взяли, и какова связь с мемликами.
Не с утечками дело, а с подходом к терминологии. Я и тогда, и сейчас опираюсь на термины языка C++.
Ты же апеллировал к ОС и прочим частным случаям, а сейчас вдруг хочешь "смотреть на вещи с позиции именно языка".
Меня это несколько удивило.
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
03.07.2015, 20:36     Что такое конструктор? #39
Цитата Сообщение от Kastaneda Посмотреть сообщение
Может по имени класса? Тогда все встает на свои места.
в этом случае сама фраза теряет смысл, скатываясь в тавтологию:
"Конструктор распознается по имени класса, которое совпадает с именем самого класса."

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

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



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

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

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

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

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

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

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

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

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

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

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

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


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

Цитата Сообщение от Tulosba Посмотреть сообщение
а сейчас вдруг хочешь "смотреть на вещи с позиции именно языка".
Меня это несколько удивило.
с позиции языка:
мемлик - явление, которое не является частью языка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 20:46     Что такое конструктор?
Еще ссылки по теме:

В этой части кода происходит объявление функций? Что такое void? Что в скобках? C++
C++ Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
03.07.2015, 20:46     Что такое конструктор?
  #40

Не по теме:

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

Yandex
Объявления
03.07.2015, 20:46     Что такое конструктор?
Ответ Создать тему
Опции темы

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