Тема: Чи являється член класу об'єктом?
Вітаю, припустимо є такий код
class A {
public:
int &x;
int y;
};
чи являється A::y об'єктом?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Чи являється член класу об'єктом?
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Вітаю, припустимо є такий код
class A {
public:
int &x;
int y;
};
чи являється A::y об'єктом?
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).
А чому так?
Тобто 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.” хіба ні?
Так і є. Ну, принаймні наскільки я розумію. Тут має місце змішання понять з однаковим іменем, здається, є загальне поняття "об'єкт", яким можна назвати багато чого, - абстракція, а є слово що значить специфічно "щось інше, разом з тим..." в якомусь контексті. Словом, біль в шиї.
Гм, доволі дивно, що isocpp дозволяє собі писати такі розмиті речі. Також мене дуже цікавить, що означає оте їхнє "OO/C++".
Хоча очевидно, що вони змішали поняття об'єкта в С++ і в ООП. Те, що нас цікавить, це перше визначення об'єкта, а саме:
object - A region of storage with associated semantics.
Хоча я б скоротив, до "An object is a region of storage", бо не зрозуміло, що таке "with associated semantics".
А чому так?
Тобто A::y це змінна, але не об'єкт?
1. Тому що члени класу починають існувати разом з об'єктом класу, сама по собі декларація члена ніякого (під)об'єкта не створює, що природно.
2. Не є ні змінною, ні об'єктом.
Бо ви не можете у A::y нічого запхати. Його не існує. Коли ви створите об'єкт типу a
A a;
то a.y буде об'єктом. А A::y - це елемент класу без конкретного розміщення, відповідно, не об'єкт. Це лише опис стосунків класу і елементу.
А я думав, автором питання, вже і мався на увазі член сконструйованого екземпляру ("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?
Ні, я мав на увазі
class A {
public:
int &x;
int y; // це оголошення об'єкта чи ні?
};
Тому я написав "чи являється A::y об'єктом"? А не "чи являється а.y об'єктом"?
Коли ви створите об'єкт типу a
A a;
то a.y буде об'єктом
Хіба y тоді не буде полем об'єкта а?
mimik, гм, здається я зрозумів звідки ноги ростуть у вашого питання.
class A { public: int &x; int y; // це оголошення об'єкта чи ні? };
Відповіддю на ваше питання буде і так і ні. Хе-хе. Зараз ми трохи пустимося берега
Все залежить від того, що ми вкладаємо у фразу "оголошення об'єкта", бачте, в стандарті С++ є деяка заплутаність в тому, що таке оголошення об'єкта. Якщо читати С++ стандарт, то там можна зустріти два наступні терміни: "declaration of an object" та "object declaration". І вони, як виявляється (хто б сумнівався), означають різне.
Виходячи з цитати:
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 ми бачимо вживання іншого терміну:
A constexpr specifier used in an object declaration declares the object as const. [...]
[...] 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". Ех, от би комітет зі стандартизації привів вордінг в порядок, замість непотрібних нововведень.
Хіба y тоді не буде полем об'єкта а?
Так, 'y' - це поле об'єкта (data member), але у виразі а.у - у буде lvalue expression та об'єктом, адже попадає під його визначення.
isocpp.org написав:object - A region of storage with associated semantics.
Хоча я б скоротив, до "An object is a region of storage", бо не зрозуміло, що таке "with associated semantics".
Перший ліпший регіон пам'яті, навіть якщо на нього десь збережено вказівник (наприклад, вільний шматок пам'яті в купі) ще не є об'єктом саме тому, що з ним ще не пов'язана ніяка семантика.
A::y - то і є та сама "асоційована семантика" без області пам'яті. Буде пам'ять - буде об'єкт.
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 нижче ніяк не уточнив, що саме на увазі він має під семантикою, що я вважаю, такий ресурс не може собі дозволяти робити. Адже під таким легким словом семантика ховається кілька сторінок документації, де вона описується.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися