C ++ - Чому функцію статичного члена не можна створити за допомогою кваліфікатора 'const'


86

Сьогодні у мене проблема. Мені потрібна staticфункція-член, constце не обов'язково, а краще. Але я не досяг успіху в своїх зусиллях. Хтось може сказати, чому чи як?


1
Що constдля вас означала б статична функція-член?
GManNickG

2
@GMan Я маю на увазі, що статична функція-член, яка ніколи не змінює жодного з своїх входів.
прабхакаран

11
Тоді ваші входи (параметри функції) повинні мати значення або const-посилання.
GManNickG

3
Це все одно не впливає на стислість аргументів функцій-членів. Це не означає "зробити все const", це означає "зробити це const".
UncleBens

@GMan ти хочеш сказати, що до аргументів потрібно додати const
prabhakaran

Відповіді:


137

Коли ви застосовуєте constкваліфікатор до нестатичної функції-члена, це впливає на thisпокажчик. Для функції-члена const, яка відповідає класу C, thisвказівник має тип C const*, тоді як для функції члена, яка не є const-кваліфікованою, thisвказівник має тип C*.

Статична функція-член не має thisвказівника (така функція не викликається на конкретному екземплярі класу), тому кваліфікація const статичної функції-члена не має сенсу.


Чи означає це, що 'const' призначений лише для змінних, таких як int, покажчик тощо?
прабхакаран,

@prabhakaran - Функції членів також можуть бути кваліфікованими за допомогою const . Джеймс це чітко згадав у своїй відповіді.
Mahesh

Також кваліфікатор const функції @Mahesh Member кваліфікує лише "цей вказівник", а не ціле. Ви все ще можете змінити глобальну змінну в рамках функції const кваліфікованого члена. Тепер це перевірив лише я.
прабхакаран

5
-1 "Статична функція-член не має цього вказівника ... тому кваліфікація const статичної функції-члена не має ніякого сенсу [таким чином]" істина сама по собі, але є помилковою як відповідь на запитання "чому ". Як відповідь він передбачає, що значення constстатичного члена повинно бути таким самим, як і для нестатичного. Як приклад того, що такого мислення немає, розглянемо значення static, яке залежить від контексту.
Вітаю і hth. - Альф

2
Це C const*чи const C*?
crisron

24

Я погоджуюся з вашим запитанням, але, на жаль, C ++ розроблений саме так. Наприклад:

class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};

На сьогоднішній день constце розглядається в контексті this. Певним чином, це вузько. Його можна зробити ширшим, застосувавши це constза межами thisпокажчика.
тобто "запропоноване" const, яке також може стосуватися staticфункцій, обмежить staticчленів від будь-яких змін.

У прикладі коду, якщо foo()це можна зробити const, то в цій функції A::sне може бути змінено. Я не бачу жодних мовних побічних ефектів, якщо це правило додано до стандартного. Навпаки, кумедно, чому такого правила не існує!


8
Можливо, те саме, що і причина того, що ви не можете конст-модифікувати безкоштовну функцію, що означає "ця функція не змінює жодних глобальних змінних". constзастосовується до об'єкта (у випадку функцій-членів const, екземпляр, до якого він викликається). Ви хочете, щоб це застосовувалось до всіх статичних членів класу, я гадаю, що якби це взагалі було розглянуто комітетом, то це не вважалося достатньо поширеною вимогою для підтримки.
Steve Jessop

1
constМодифікатор не застосовується до методів членів або змінним членів, але з неявним this-вказівник. Оскільки метод статичного члена не прив'язаний до об'єкта, немає this-pointer, щоб зробити const.
Ruud Althuizen

1

Не вдаючись у подробиці, це тому, що може бути об’єкт, модифікований функцією, а може і не бути, тому const є неоднозначним для компілятора.

Згадаймо, що constпідтримує об’єкти постійними, але тут може бути або не бути об’єктом постійного збереження.


2
"може чи не може"? Статична функція-член ніколи не має thisвказівника. (Окрім цього, constне підтримує об’єкти постійними. Це перешкоджає використанню певного вказівника або посилання для модифікації об’єкта, але модифікація все одно може відбуватися за іншим шляхом)
Бен Войгт,

1

Шкода, що C ++ не приймає його відповідно до дизайну, але логічно мало випадків використання, в яких він добре перевіряється.

Функція, яка є допустимою на рівні класу (статична), може не змінювати будь-які статичні дані, можливо, вона просто запитує дані, які мають бути const. Може бути, так і повинно бути

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios

1

'Функція-член const' не може змінювати об'єкт, до якого вона викликається, але статичні функції-члени не викликаються до жодного об'єкта. Він використовується безпосередньо оператором роздільної здатності. Таким чином, наявність функції статичного члена const не має сенсу, отже, вона є незаконною.

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