Сьогодні у мене проблема. Мені потрібна 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для вас означала б статична функція-член?