Из-за того, как работают объекты Objective-C, он const
перестает быть принудительным и становится нотацией для программиста. Рассмотрим эту программу:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
Это на самом деле не скомпилируется (я использую clang): компилятор может обнаружить попытку изменить тип примитива C и выдает ошибку. Но теперь сравните это с этой программой:
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
Несмотря на то, что функции передается постоянный указатель на постоянный объект, все же возможно изменить объект.
В объектно-ориентированном программировании лучший способ обеспечить постоянную природу объекта состоит в том, чтобы сделать этот объект неизменным, то есть не предоставлять никаких методов, которые могут изменить его состояние. Представьте, что функция выше взяла NSString
аргумент вместо NSMutableString
, и что я передал литерал @"Hello"
вместо изменяемой копии. В настоящее время, по правде говоря, нет никаких шансов поменять переданный объект [*]. Objective-C не имеет никакого способа обеспечить это, в отличие от const
или final
ссылки на объекты в других языках OO.
Для сравнения, const
в C ++ работает совершенно иначе. Если я получаю const
ссылку на объект C ++, мне разрешено вызывать const
функции-члены только для этого объекта. Эти функции сохраняют const
-ность объекта, либо не внося никаких изменений, либо изменяя только переменные-члены, которые были явно помечены mutable
конструктором класса. Итак, представьте, что у меня был какой-то тип MutableString
в C ++, который эквивалентен NSMutableString
Objective-C. Эквивалент моего примера выше будет выглядеть примерно так:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
Это определенно не скомпилируется: в дополнение к appendString()
тому const
, что эта функция не является операцией, она удаляет const
классификатор из ссылки на тип, для которого требуется a const_cast
.
[*] Я ожидаю, что есть некоторый искаженный способ сделать это, но теперь мы находимся в сферах одного программиста, пытающегося саботировать другого, делая «умные» вещи.
const
оформление как значимое, поэтому вы получаете искажения, такие как псевдонимы или приведения, для подавления предупреждений, но в результате этих искажений поведение программы не изменяется.const
что все еще может быть полезно в Objective C заявить, что указатель на объект никогда не назначается для указания на другой объект . Т.е. сNSString * const x
вами известно, чтоx
всегда будет одна и та же строка, а не другая строка.Что касается цели C - я не программирую в ней, поэтому не могу ответить на вопрос. Хотя я могу ответить на вопрос: «Должны ли люди
const
много использовать при программировании в Objective C?» - это однозначное «Да».Constness - это, по сути, функция безопасности программного обеспечения, которая используется для повышения надежности и удобства обслуживания программ. Многие программисты растут, не понимая значения
const
s, пока однажды не случится что-то плохое, и у них появится момент «Ах, ха» - «О, это то, чтоconst
используется для». Полностью возможно написать программу без констант, практически невозможно сделать такую программу надежной.Многие примеры кода на самом деле не являются программами, это просто фрагменты кода, предназначенные для демонстрации определенной функции. Они не используют,
const
поскольку это отвлекает от того, что пытается сделать образец. Другой тип кода, который вы видите, - это код, написанный неопытными программистами, которые основывают то, что они делают, на примерах, которые они изучили, или те, которые знают о константах, и слишком ленивы, чтобы их использовать.источник
Я не использовал цель-С в течение очень долгого времени.
Однако мне интересно, почему никто не упомянул этот аспект.
Objective-c уже имеет что-то еще, связанное с константой. переменчивость
Например, Nstring * будет указывать на постоянную строку. Если вам нужна строка, которую вы можете изменить, вы используете NMutableString или что-то в этом роде. Эта NMutableString предоставит дополнительные методы, которые позволяют людям изменять строку.
А что если вы хотите, чтобы сам указатель был константой? Мне никогда не придется беспокоиться об этом при написании очень большого проекта.
Вот и думаю, поэтому.
источник