powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Некоторые вопросы о программировании на C++
25 сообщений из 142, страница 4 из 6
Некоторые вопросы о программировании на C++
    #39051255
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury2.1 Правильный ли вывод: При разработке ПО желательно инициализировать объекты при их создании. В ООП каждый объект должен быть проинициализирован при создании. Можно ли считать это одной из важны деталей ООП ?

Хорошим тоном сейчас является RAII . Предполагается, что для отказа от данного принципа в каждом конкретном случае должны быть очень веские и явно и четко формулируемые причины. Одной из таких может быть "дороговизна" операции инициализации. Как говорится, делайте так, если у Вас нет _веских_ причин делать иначе...
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051257
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MozokSashaMercury1.3 Как осуществляется защита от злонамеренного доступа к закрытым полям класса ?

Pimpl .


Я не уверен, что именно защита от "целеустремлённого настойчивого буратины". Для особо настойчивых просто добавляется необходимость взятия ещё одного адреса расчёта смещения. Мне кажется, что гораздо более существенными фишками этой техники являются (b) adding new data members to the private struct does not affect binary compatibility; (c) the header file containing the class declaration only needs to #include those other files needed for the class interface, rather than for its implementation. One side benefit is that compilations are faster because the header file changes less often. . Что, собственно, есть способ отделения интерфейса от реализации (без болезней типа необходимости пересобрать всё-всё только из-за изменения одной строчки в хедере).
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051346
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

BS пишет:
A constructor is recognized by having the same name as the class itself.
И не только он, многие говорят о том, что конструктор имеет имя класса которому он принадлежит.

Однако в стандарте действительно(как сказал выше Mozok ) сказано:
Constructor do not have names.

Согласно стандарту существует специальный синтаксис объявления конструктора. Не читал далее, но вероятнее всего такой синтаксис существует для всех special member function.
Mozok, всё что вы сказали, я понял, несмотря на то, что не до конца понимаю причину некоторых вещей, но она видимо глубже нежели анализ конструкторов. Но вы также говорите что нельзя конструктор явно вызывать. Как я понял, реализация может неявно определить все или некоторые special member function в том случае, если они не определены явно разработчиком. В таком случае, если программист явно определяет, fe, default constructor, он и будет явно вызываться при создании объекта без использования параметров. Разве в данном случае это не будет явным вызовом конструктора по умолчанию ? Читая стандарт, мне показалось что смысловая нагрузка слов: имплицитно и эксплицитно в контексте ООП в С++ несколько иная. Или ошибаюсь ?
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051356
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.

BS пишет:
A constructor is recognized by having the same name as the class itself.
И не только он, многие говорят о том, что конструктор имеет имя класса которому он принадлежит.

Однако в стандарте действительно(как сказал выше Mozok ) сказано:
Constructor do not have names.

Согласно стандарту существует специальный синтаксис объявления конструктора.И что тебя смущает? В одном случае говорится про определение, в другом про представление.


SashaMercuryКак я понял, реализация может неявно определить все или некоторые special member function в том случае, если они не определены явно разработчиком.Реализация ничего определить не может. По определению самой реализации. А вот компилятор действительно делает реализацию всех недостающих обязательных членов класса.

SashaMercury В таком случае, если программист явно определяет, fe, default constructor, он и будет явно вызываться при создании объекта без использования параметров. Разве в данном случае это не будет явным вызовом конструктора по умолчанию ?Не существует "конструктора по умолчанию". Есть просто разные конструкторы, с параметрами и без. А какой из них будет вызван зависит от уже от того как ты будешь создавать объект.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051365
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryЗдравствуйте.

BS пишет:
A constructor is recognized by having the same name as the class itself.
И не только он, многие говорят о том, что конструктор имеет имя класса которому он принадлежит.

Однако в стандарте действительно(как сказал выше Mozok ) сказано:
Constructor do not have names.

Согласно стандарту существует специальный синтаксис объявления конструктора.И что тебя смущает? В одном случае говорится про определение, в другом про представление.



В стандарте нет определения того, что такое представление, что вы имеете ввиду и почему используете этот термин ? Меня смущает, что слова name и constructor находятся в одном предложении, и это не предложение Constructor do not have names. И такое не только у BS. В стандарте чётко написано:
Constructors do not have names. A special declarator syntax is used to declare or define the constructor. Потому не надо ассоциировать имя класса и конструктор. У конструктора нет имени, существует только синтаксис определения и объявления конструктора.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051366
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Реализация ничего определить не может. По определению самой реализации. А вот компилятор действительно делает реализацию всех недостающих обязательных членов класса.

Тогда как вы переведёте такую фразу, fe:
ISO/IEC N3242=11-0012 12.1 Special member functionsThe implementation will implicitly declare these members functions for some class types when the program does not explicitly declare them. The implementation will implicitly defined them if they are odr-use.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051387
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Не существует "конструктора по умолчанию".
В стандарте описан default constructor.
A default constructor for a class X is constructor of class X that can be called without an argument.



Единственное что меня смущает, я выделил красным. Видимо реализация языка в VS не совсем корректная, ибо они реализовали не can be, a must be. Такой код, например, выдаст ошибку на этапе компиляции

Код: plaintext
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.
#include <stdio.h>

class X
{
	int value;
public:
	X();
	void print();
};

X::X()
{
	value = 10;
}

void X::print()
{
	printf("value=%i\n", value);
}

int main()
{
	X x();
	x.print();
	return 0;
}
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051396
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скобки убери, тогда скомпилируется.
Код: plaintext
1.
X x;
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051397
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я не так понял. В стандарте написано о том, что вызов может быть без аргументов. Так он и должен быть без аргументов. Но и синтаксис вызова должен быть иной. Вот так.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051401
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСкобки убери, тогда
Код: plaintext
1.
2.
3.
[/SRC] скомпилируется.
[src c++]
X x;



Безусловно. Изначально подумал что и такой синтаксис должен работать
Код: plaintext
1.
X x();
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051455
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИзначально подумал что и такой синтаксис должен работать
Код: plaintext
1.
X x();


Тоже вполне нормальный код - объявление функции, возвращающей X.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051489
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstSashaMercuryИзначально подумал что и такой синтаксис должен работать
Код: plaintext
1.
X x();


Тоже вполне нормальный код - объявление функции, возвращающей X.

Вероятно поэтому синтаксис использования конструктора по умолчанию имеет такой вид X x.3048
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051495
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВероятно поэтому синтаксис использования конструктора по умолчанию имеет такой вид X xне вероятно - очевидно ))
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051623
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю топик и меня не покидает ощущение вязкого затягивающего кошмара.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051697
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧитаю топик и меня не покидает ощущение вязкого затягивающего кошмара.

Почему ?
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051710
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВ стандарте нет определения того, что такое представление, что вы имеете ввиду и почему используете этот термин ?
Термин «представление» в мире С++ не используется. Есть «объявление (declaration)» и «определение (definition)». Они могут совпадать в коде.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051716
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо вы также говорите что нельзя конструктор явно вызывать.
Можно и так всегда делают. Более того:

- Можно вызвать конструктор повторно.
- Конструктор можно явно вызвать для произвольного участка памяти.
- Можно явно вызвать деструктор.

Но это редко нужно и требует серьезного обоснования и глубоких знаний.

SashaMercuryВ таком случае, если программист явно определяет, fe, default constructor, он и будет явно вызываться при создании объекта без использования параметров.
Что такое «fe»? :)
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051844
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonЧитаю топик и меня не покидает ощущение вязкого затягивающего кошмара.

Почему ?
Обычно топик заканчивается либо решением проблемы. Либо каждый для себя делает выводы.
А тут - философский пинг-понг. Что то тип:

Код: plaintext
1.
2.
3.
4.
5.
6.
Разраб№1 : А я вот люблю есть опилки.
Разраб№2 : Опилки?  Ты что! Их же не рекомендует минздрав.
Разраб№1 : А если их сварить? Ничо так.
Разраб№3 : Я тоже иногда ем опилки. Они красиво выглядят. А хлеб - некрасиво.
Разраб№4 : Но если хлеб посыпать опилками то ничо так.
mayton : Какого хрена тут вообще происходит!!!!?????
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39051848
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot mayton
Код: plaintext
1.
2.
3.
4.
5.
6.
Разраб№1 : А я вот люблю есть опилки.
Разраб№2 : Опилки?  Ты что! Их же не рекомендует минздрав.
Разраб№1 : А если их сварить? Ничо так.
Разраб№3 : Я тоже иногда ем опилки. Они красиво выглядят. А хлеб - некрасиво.
Разраб№4 : Но если хлеб посыпать опилками то ничо так.
mayton : Какого хрена тут вообще происходит!!!!?????


[/quot]тебе отсыпать опилок? ;) у меня свежие есть )))
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39052198
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav- Можно вызвать конструктор повторно.

Это как? Надеюсь, не имелся в виду вызов конструкторов по цепочке, как в Java.
petrav- Конструктор можно явно вызвать для произвольного участка памяти.

И это как? placement new не предлагать, это вызов operator new, а не коструктора.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39052206
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так placement new и есть только вызов конструктора.
n4527.pdf§18.4.​1.3 Placement forms
These functions are reserved, a C++ program may not define functions that displace the versions in the Standard C++ library.
...
void* operator new(std::size_t size, void* ptr) noexcept;
Returns: ptr.
Remarks: Intentionally performs no other action.
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39052208
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozokpetrav- Можно вызвать конструктор повторно.

Это как? Надеюсь, не имелся в виду вызов конструкторов по цепочке, как в Java.
petrav- Конструктор можно явно вызвать для произвольного участка памяти.

И это как? placement new не предлагать, это вызов operator new, а не коструктора.

placement new -- это как раз вызов конструктора, а не operator new.
operator new -- это создание объекта в памяти (выделение памяти) и затем его инициализация путём вызова одного из конструкторов.
placement new -- напротив, только инициализация объекта в памяти путём вызова одного из конструкторов .
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39052277
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozokpetrav- Можно вызвать конструктор повторно.

Это как? Надеюсь, не имелся в виду вызов конструкторов по цепочке, как в Java.
petrav- Конструктор можно явно вызвать для произвольного участка памяти.

И это как? placement new не предлагать, это вызов operator new, а не коструктора.
Вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>
using namespace std;

class Foo
{
public:
	Foo(): m_i()   {}
	Foo( int const a_i ): m_i( a_i )   {}
	~Foo()   { m_i = int(); }
private:
	int m_i;
};

int main()
{
	Foo f; // Конструктор по умолчанию.
	new (&f) Foo(); // Повторный вызов конструктора по уполчанию.
	new (&f) Foo( 1 ); // Повторный вызов конструктора с параметрами.
	f.~Foo(); // Явный вызов деструктора.

	return 0;
	// Ооопс! Еще один вызов деструктора!
}


Я, правда, считал, что можно напрямую вызвать конструктор как-то так:
Код: plaintext
1.
f.Foo::Foo();


Не компилируется, но это ничего не меняет.

Что там с цепочками в Яве я не знаю. :(
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39052292
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravЧто там с цепочками в Яве я не знаю. :(
Что за цепочки? "Method chaining"?
...
Рейтинг: 0 / 0
Некоторые вопросы о программировании на C++
    #39052296
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonpetravЧто там с цепочками в Яве я не знаю. :(
Что за цепочки? "Method chaining"?
Я не знаю что имелось в виду. Нужно уточнить у Mozok.
...
Рейтинг: 0 / 0
25 сообщений из 142, страница 4 из 6
Форумы / C++ [игнор отключен] [закрыт для гостей] / Некоторые вопросы о программировании на C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]