1

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

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

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

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

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

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

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

isocpp.org написав:

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).

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

3

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

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

Подякували: ch0r_t, mimik, koala, leofun014

4 Востаннє редагувалося mimik (27.08.2021 18: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 Востаннє редагувалося ch0r_t (27.08.2021 18:58:02)

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

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

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

6

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

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

isocpp.org написав:

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. Не є ні змінною, ні об'єктом.

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

7

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

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

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

8 Востаннє редагувалося ch0r_t (27.08.2021 21: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 (27.08.2021 23: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, ch0r_t, leofun014

12

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

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

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

13

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

wander написав:
isocpp.org написав:

object - A region of storage with associated semantics.

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

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

Подякували: ch0r_t, koala, leofun013

14

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

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

15

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

ReAl написав:
wander написав:
isocpp.org написав:

object - A region of storage with associated semantics.

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

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

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

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