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.