Вы можете сделать это с помощью коллекции проекций :
Names of Users
Сам указатель имеет тип значения, таким образом, не имеет смысла делать это константой. То, что функция вызывающей стороны делает с возвращенным значением, не может быть ограничено вызванной функцией. Это сродни попытке определить что-то как:
const int getInt();
getInt (), в этом случае, просто возвращает международное значение (не ссылка). Это переходит к регистру, затем функция вызывающей стороны получает его и делает то, что это хочет с ним.
Почему Вы заботитесь, изменяется ли указатель? Выполнение этого похоже на высказывание:
const int f() {
...
}
Значение, возвращенное f (), является копией - изменение, это ничего не изменяет, таким образом, существует точка имени в создании его константа.
Я соглашаюсь с ответом Juliano, Вы хотите, чтобы constness указателя был на сайте вызова.
Лучший способ сделать, что Вы ищете, состоит в том, чтобы иметь Ваш возврат функции ссылка константы на объект:
const MyClass& getMyClass()
{
return myClass;
}
По определению ссылки не могут быть изменены, таким образом, Вы были бы более обеспечены.
Конечно, это не будет работать, если Ваша функция попытается создать объект MyClass. В этом случае можно просто переместить дополнительную константу в сайт вызова.
// function definition
const MyClass* createMyClass()
{
return new MyClass("I Love C++");
}
// use of a const pointer to a MyClass which is const
const MyClass* const myClassInstance = creatMyClass();
спецификатор константы ничего не означает, потому что Вы возвращаете указатель
Один простой способ удостовериться Вы определяете тип возврата, который Вы хотите, должны всегда добавлять модификаторы справа (в противоположность левому) сторону исходного типа.
MyClass // MyClass object
MyClass const // MyClass object which can't be modified
MyClass const & // reference of an unmodifiable MyClass object
MyClass const * // pointer to an unmodifiable MyClass object
MyClass const * const // unmodifiable pointer to an unmodifiable MyClass object
MyClass const * const & // reference of an unmodifiable pointer to an unmodifiable MyClass object
Это должно помочь удостовериться, что Ваши типы возврата никогда не бессмысленны снова :)
Почему возвращают значение константы? Рассмотрите следующее (и извините лишенные воображения имена переменной):
struct A { int a; };
A operator+(const A& a1, const A& a2)
{
A a3 = { a1.a + a2.a };
return a3;
}
Учитывая, что объявление operator+
, Я могу сделать следующее:
A a = {2}, b = {3}, c = {4}, d = ((a+b) = c);
Правильно, я просто присвоил временному файлу A
это было возвращено operator+
. Получающееся значение d.a
4, не 5. Изменение типа возврата operator+
кому: const A
предотвращает это присвоение, вызывая выражение (a+b) = c
генерировать ошибку компилятора.
Если я пытаюсь присвоить указателю или целому числу, возвращенному из функции, мой компилятор (MSVC) генерирует "левый операнд, должно быть l-значение" ошибка, которая кажется согласовывающейся с компилятором ARM, говоря Вам, что constness указателя бессмыслен - указателю нельзя присвоить так или иначе. Но для классов/структур, по-видимому, это должно хорошо присвоить возвращаемым значениям неконстанты.