1

Тема: Чи являється член класу об'єктом?

Вітаю, припустимо є такий код

class A {
public:
    int &x;
    int  y;
};

чи являється A::y об'єктом?

2 Востаннє редагувалося tchort (27.08.2021 19:44:57)

Re: Чи являється член класу об'єктом?

ISO C++ Каже, що ні.
https://isocpp.org/wiki/faq/classes-and-objects

object - A region of storage with associated semantics.

After the declaration int i; we say that “i is an object of type int.” In OO/C++, “object” usually means “an instance of a class.” Thus a class defines the behavior of possibly many objects (instances).

3

Re: Чи являється член класу об'єктом?

Ні, не являється. Тому що нестатичні члени класу ніколи не є об’єктами, але можуть бути посиланнями.

Подякували: tchort, mimik, koala3

4 Востаннє редагувалося mimik (27.08.2021 19:52:16)

Re: Чи являється член класу об'єктом?

А чому так?
Тобто A::y це змінна, але не об'єкт?

“object” usually means “an instance of a class.” Thus a class defines the behavior of possibly many objects (instances).

Але об'єкт це не лише “an instance of a class.” хіба ні?

5 Востаннє редагувалося tchort (27.08.2021 19:58:02)

Re: Чи являється член класу об'єктом?

Так і є. Ну, принаймні наскільки я розумію. Тут має місце змішання понять з однаковим іменем, здається, є загальне поняття "об'єкт", яким можна назвати багато чого, - абстракція, а є слово що значить специфічно "щось інше, разом з тим..." в якомусь контексті. Словом, біль в шиї.

Подякували: mimik1

6

Re: Чи являється член класу об'єктом?

Гм, доволі дивно, що isocpp дозволяє собі писати такі розмиті речі. Також мене дуже цікавить, що означає оте їхнє "OO/C++". :)
Хоча очевидно, що вони змішали поняття об'єкта в С++ і в ООП. Те, що нас цікавить, це перше визначення об'єкта, а саме:

object - A region of storage with associated semantics.

Хоча я б скоротив, до "An object is a region of storage", бо не зрозуміло, що таке "with associated semantics".

Прихований текст

P.S. - в C++20 змінили опис того, що таке об'єкт, але нам це зараз не цікаво.

mimik написав:

А чому так?
Тобто A::y це змінна, але не об'єкт?

1. Тому що члени класу починають існувати разом з об'єктом класу, сама по собі декларація члена ніякого (під)об'єкта не створює, що природно.
2. Не є ні змінною, ні об'єктом.

Подякували: tchort, mimik2

7

Re: Чи являється член класу об'єктом?

Бо ви не можете у A::y нічого запхати. Його не існує. Коли ви створите об'єкт типу a
A a;
то a.y буде об'єктом. А A::y - це елемент класу без конкретного розміщення, відповідно, не об'єкт. Це лише опис стосунків класу і елементу.

8 Востаннє редагувалося tchort (27.08.2021 22:47:27)

Re: Чи являється член класу об'єктом?

А я думав, автором питання, вже і мався на увазі член сконструйованого екземпляру ("instance") класу. (Інакше ж не має сенсу про опис/устрій відношень питати чи є він об'єктом...)


The object in the object is still an object, thou what constitutes and defines an object, is not necessary and cannot be, just another object?

The enemy of my enemy is my friend, or our enemy?...

https://replace.org.ua/uploads/images/10563/1a6c30cf398fa96b938acf67bfd9edef.jpg

Подякували: leofun011

9

Re: Чи являється член класу об'єктом?

Ні, я мав на увазі

class A {
public:
    int &x;
    int  y; // це оголошення об'єкта чи ні?
};

Тому я написав "чи являється A::y об'єктом"? А не "чи являється а.y об'єктом"?

10

Re: Чи являється член класу об'єктом?

Коли ви створите об'єкт типу a
A a;
то a.y буде об'єктом

Хіба y тоді не буде полем об'єкта а?

11 Востаннє редагувалося wander (28.08.2021 00:41:53)

Re: Чи являється член класу об'єктом?

mimik, гм, здається я зрозумів звідки ноги ростуть у вашого питання.

mimik написав:
class A {
public:
    int &x;
    int  y; // це оголошення об'єкта чи ні?
};

Відповіддю на ваше питання буде і так і ні. Хе-хе. Зараз ми трохи пустимося берега :)
Все залежить від того, що ми вкладаємо у фразу "оголошення об'єкта", бачте, в стандарті С++ є деяка заплутаність в тому, що таке оголошення об'єкта. Якщо читати С++ стандарт, то там можна зустріти два наступні терміни: "declaration of an object" та "object declaration". І вони, як виявляється (хто б сумнівався), означають різне.
Виходячи з цитати:

[basic.pre]\6 написав:

A variable is introduced by the declaration of a reference other than a non-static data member or of an object. [...]

Ми зустрічаємо вже знайому нам конструкцію declaration of smth. І ось тут починається саме кумедне. Перша проблема в неоднозначності того, що таке "declaration of a reference". Схоже на те, що "declaration of a reference" - це оголошення, яке оголошує певне ім'я як тип посилання, а не оголошення, яке починає життя конкретного посилання. І навпаки, "declaration of an object" має тлумачитись як оголошення, яке оголошує певне ім'я певному об'єкту та починає його життя.

Тож у вашому випадку 'x' - це "declaration of a reference", але 'y' - це не "declaration of an object". Звідси у [dcl.constexpr]\10 або у [dcl.pre]\10 ми бачимо вживання іншого терміну:

[dcl.constexpr]\10 написав:

A constexpr specifier used in an object declaration declares the object as const. [...]

[dcl.pre]\10 написав:

[...] If the decl-specifier-seq contains no typedef specifier, the declaration is called a function declaration if the type associated with the name is a function type and an object declaration otherwise.

Звідси очевидно, що "declaration of an object" та "object declaration" - це різні речі. І якщо "declaration of an object" - це оголошення, яке оголошує певне ім'я певному об'єкту та починає його життя, то "object declaration" - це оголошення об'єкта, але не обов'язково починає його життя. Отже, виходячи зі всього вище сказаного:

class A {
public:
    int &x; // Not the declaration of an object. But an object declaration. And the declaration of a reference.
    int  y; // Not the declaration of an object. But an object declaration.
};

// Тоді можна і так сказати:
extern int &z; // Not the declaration of an object. But an object declaration. And the declaration of a reference.
int i;         // The declaration of an object. And an object declaration. But not the declaration of a reference.

Також кумедно, що в стандарті є вже термін "object definition", який фактично означає теж, що і "declaration of an object". Ех, от би комітет зі стандартизації привів вордінг в порядок, замість непотрібних нововведень.

Прихований текст

https://media.giphy.com/media/l4FATJpd4LWgeruTK/giphy.gif?cid=ecf05e47ksgcbp0vujecnple1ma6oedvoq0auh10j32usx9m&rid=giphy.gif&ct=g

0xDADA11C7 написав:

Хіба y тоді не буде полем об'єкта а?

Так, 'y' - це поле об'єкта (data member), але у виразі а.у - у буде lvalue expression та об'єктом, адже попадає під його визначення.

Подякували: mimik, 0xDADA11C7, tchort, leofun014

12

Re: Чи являється член класу об'єктом?

Тобто, якщо ми введемо поняття:
- "оголошення об'єкта" для object declaration;
- "визначення об'єкта" для declaration of an object та object definition.
То, "у" - оголошує об'єкт, але не визначає його. Чи вірно я все зрозумів?

Подякували: wander, koala, tchort3

13

Re: Чи являється член класу об'єктом?

wander написав:

object - A region of storage with associated semantics.

Хоча я б скоротив, до "An object is a region of storage", бо не зрозуміло, що таке "with associated semantics".

Перший ліпший регіон пам'яті, навіть якщо на нього десь збережено вказівник (наприклад, вільний шматок пам'яті в купі) ще не є об'єктом саме тому, що з ним ще не пов'язана ніяка семантика.

Подякували: tchort, koala2

14

Re: Чи являється член класу об'єктом?

A::y - то і є та сама "асоційована семантика" без області пам'яті. Буде пам'ять - буде об'єкт.

15

Re: Чи являється член класу об'єктом?

ReAl написав:
wander написав:

object - A region of storage with associated semantics.

Хоча я б скоротив, до "An object is a region of storage", бо не зрозуміло, що таке "with associated semantics".

Перший ліпший регіон пам'яті, навіть якщо на нього десь збережено вказівник (наприклад, вільний шматок пам'яті в купі) ще не є об'єктом саме тому, що з ним ще не пов'язана ніяка семантика.

Гм, схоже потрібно пояснити. Я виніс ось цю "семантику" за дужки нашого обговорення, бо:
1. це не стосувалося даного питання;
2. так було зручніше для подальшого пояснення;
3. "семантика" об'єктів змінюється від стандарту до стандарту (привіт С++20), а isocpp нижче ніяк не уточнив, що саме на увазі він має під семантикою, що я вважаю, такий ресурс не може собі дозволяти робити. Адже під таким легким словом семантика ховається кілька сторінок документації, де вона описується.

Подякували: mimik1