Чи правильно сказати, що змінна - це примірник типу даних?


9

(що може змінити своє значення протягом програми)

Або "екземпляр чогось" суворо пов'язаний з класами та об'єктами? Якщо так, то як би ви визначили поняття "змінної", коли мова йде про C ++?


C # і Java відрізняються від C ++ двома цікавими способами. По-перше, вони намагаються об'єднати примітивні типи з об'єктними (та структуровими) типами (так що можна говорити про екземпляр int), тоді як C ++ - ні. По-друге, у C # та Java змінні типів об’єктів неявно посилаються на екземпляри (класів) у купі, а також, що ми не говоримо про покажчики на об’єкти, тоді як у C ++, як @ відповідь coredump, локальні змінні типів об'єктів є прив'язкою до екземплярів стека, і ми чітко розмежовуємо між об'єктами та покажчиками на об’єкти.
Ерік Ейдт

Відповіді:


8

Наскільки я знаю, правильно називати значення екземплярів примітивних типів цього типу (див., Наприклад, "C ++ Type Type" з посібника Visual Studio, але я все ще шукаю інше джерело), ​​хоча я вважаю, що цей термін є в основному використовується при обговоренні об’єктів. Об'єкт - це екземпляр класу C, якщо він був побудований з конструктора, визначеного або в класі C, або в одному з його підкласів.

Змінна в C ++ не є концепцією виконання. Він існує всередині вашого компілятора як лексичне пов'язування між назвою змінної та абстрактним (мінливим, якщо не const) розташуванням. Після того, як програма складається, змінних більше немає. Натомість дані зчитуються та записуються в регістри, пам'ять тощо.


2
" Значення примітивних типів, як правило, не є примірниками цього типу; воно зарезервоване для об'єктів і класів. " Це зовсім не так. Ніде в стандарті значення примітивних типів не вважаються об'єктами. Також визначення змінної ніяк не змінюється залежно від того, чи це визначений користувачем клас або примітивний тип.
Нікол Болас

@ NicolBolas Я ніколи не чув, щоб хтось називав цілі числа як екземпляри чогось у контексті C ++, і я впевнений, що правильно сказати, що вони не є примірниками нічого, навіть якщо стандарт прямо не говорить про це. Якщо ні, то які вони екземпляри? Я також не бачу, де ця відповідь стверджує, що визначення змінної змінюється між примітивними типами та об'єктами; начебто (afaik правильно) стверджує, що "екземпляри" просто не мають нічого спільного з визначенням змінної.
Іксрек

2
@Ixrec: " Якщо ні, то які вони екземпляри? " Тип int. Стандарт C ++ не розрізняє примітивні типи і непримітивні типи, коли йдеться про те, що роблять декларації змінних. Тож T t;оголошує об’єкт типу T, незалежно від того, який тип Tбуде.
Нікол Болас

1
@Ixrec: Зауважте, що літерали - це різна річ. Літерали - це своєрідний первіст. Але ви не можете зробити буквальні змінні, тож це інша дискусія.
Нікол Болас

5

Або "екземпляр чогось" суворо пов'язаний з класами та об'єктами? Якщо так, то як би ви визначили поняття "змінної", коли мова йде про C ++?

Сказати це максимально стисло для C ++

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

Просто, щоб було зрозуміло:

  • Не всі області пам'яті містять об'єкти. Наприклад, деякі області пам'яті можуть містити значення "сміття".
  • Не всі об’єкти, що зберігають пам'ять, отримають ім'я в коді. Об'єкти можуть перебувати в неіменованих областях пам'яті, таких як позиція в масиві або десь на Купі, на яку посилається вказівник.
  • Коли область пам’яті містить сміття, це зазвичай або тому, що жоден об’єкт не був закреслений в цьому місці, або тому, що якийсь раніше існуючий об’єкт був знищений.

1
POD - об'єкти в C ++. Не всі регіони пам’яті є об’єктами, але ПДД - це не просто регіони пам’яті.
Нікол Болас

1
I другий NicolBolas: PODS - це об'єкти. Однак у вас є момент, коли ви говорите про нещодавно malloc()виданий, але неініціалізований буфер: це область пам'яті, яка ще не є об'єктом. Так само об'єкт, який був явно знищений: це область пам'яті, яка вже не є об'єктом.
cmaster - відновити моніку

@NicolBolas справедливий коментар, я трохи змінив це формулювання
Бен Коттрелл,

1

Ну, що означає "правильно"?

Якщо ми хочемо бути надто суворими щодо цього, нам потрібно розрізняти:

  • Сторона синтаксису : вирази мають (статичні) типи
  • Семантика сторона: об'єкти є екземплярами з класів

Тож тоді змінна - будучи виразом - мала б тип. Його значення - об'єкт, на який він посилається - буде екземпляром якогось класу. І зауважте, що тип змінної та клас об’єкта, як правило, не є одне і те ж - статичний тип змінної ставить верхню межу класів виконання об'єктів, так що класи повинні бути підтипом класу, що відповідає типу.

Ви хочете постійно повторювати цю велику рот? Чорт ні. Наскільки суворо проти слабко ми хочемо поговорити, залежить від контексту. Тому часто немає жодної проблеми сказати, що "змінна є екземпляром цього типу". Що насправді там відбувається, це те, що ми використовуємо змінну та тип метонімічно для позначення об'єкта та надкласу його класу виконання.


1

Якщо ви не хочете провести все своє життя в пуризмі та софізмі ... так.

Кожен раз, коли ви зберігаєте щось, що унікально визначило, це використовується для підробки інших унікально ідентифікованих речей, які ви робите примірниками.

  • Проект створює інстанцію в продуктах
  • Джерело інстанціює у виконувані файли
  • Шаблон інстанціювати на типи.
  • Тип екземпляра в змінні.

Деякі з цих примірників можуть мати більш точні назви, але загалом це працює.


0

Багато людей резервують "екземпляр" для екземплярів занять. Якщо ви це зробите, то в C ++ змінна може бути екземпляром класу, посиланням на екземпляр, вказівником на екземпляр або примітивним типом (ви, ймовірно, вважати структури в цьому контексті класами, вони майже абсолютно те саме). У Java або Objective-C змінні ніколи не будуть екземплярами, а можливо посиланнями на екземпляри.

Забули: на короткий час вказівник C ++ може бути вказівником на необроблену пам'ять, наприклад "це" до того, як конструктор почне виконувати. Ви, ймовірно, ще не зателефонували * цьому екземпляру.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.