Сьогодні у мене проблема. Мені потрібна static
функція-член, const
це не обов'язково, а краще. Але я не досяг успіху в своїх зусиллях. Хтось може сказати, чому чи як?
Сьогодні у мене проблема. Мені потрібна static
функція-член, const
це не обов'язково, а краще. Але я не досяг успіху в своїх зусиллях. Хтось може сказати, чому чи як?
Відповіді:
Коли ви застосовуєте const
кваліфікатор до нестатичної функції-члена, це впливає на this
покажчик. Для функції-члена const, яка відповідає класу C
, this
вказівник має тип C const*
, тоді як для функції члена, яка не є const-кваліфікованою, this
вказівник має тип C*
.
Статична функція-член не має this
вказівника (така функція не викликається на конкретному екземплярі класу), тому кваліфікація const статичної функції-члена не має сенсу.
const
статичного члена повинно бути таким самим, як і для нестатичного. Як приклад того, що такого мислення немає, розглянемо значення static
, яке залежить від контексту.
C const*
чи const C*
?
Я погоджуюся з вашим запитанням, але, на жаль, 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
не може бути змінено. Я не бачу жодних мовних побічних ефектів, якщо це правило додано до стандартного. Навпаки, кумедно, чому такого правила не існує!
const
застосовується до об'єкта (у випадку функцій-членів const, екземпляр, до якого він викликається). Ви хочете, щоб це застосовувалось до всіх статичних членів класу, я гадаю, що якби це взагалі було розглянуто комітетом, то це не вважалося достатньо поширеною вимогою для підтримки.
const
Модифікатор не застосовується до методів членів або змінним членів, але з неявним this
-вказівник. Оскільки метод статичного члена не прив'язаний до об'єкта, немає this
-pointer, щоб зробити const
.
Не вдаючись у подробиці, це тому, що може бути об’єкт, модифікований функцією, а може і не бути, тому const є неоднозначним для компілятора.
Згадаймо, що const
підтримує об’єкти постійними, але тут може бути або не бути об’єктом постійного збереження.
this
вказівника. (Окрім цього, const
не підтримує об’єкти постійними. Це перешкоджає використанню певного вказівника або посилання для модифікації об’єкта, але модифікація все одно може відбуватися за іншим шляхом)
Шкода, що 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
'Функція-член const' не може змінювати об'єкт, до якого вона викликається, але статичні функції-члени не викликаються до жодного об'єкта. Він використовується безпосередньо оператором роздільної здатності. Таким чином, наявність функції статичного члена const не має сенсу, отже, вона є незаконною.
const
для вас означала б статична функція-член?