синтаксис/прототип функции c++ - тип данных после скобок
Я очень хорошо знаком с объявлениями стандартных функций C/C++. Я недавно видел что-то вроде этого:
int myfunction(char parameter) const
вышеизложенное является только гипотетическим примером, и я даже не знаю, имеет ли это смысл. Я имею в виду часть после параметра. Константа. Что это?
более реальный пример:
wxGridCellCoordsArray GetSelectedCells() const
можно найти здесь
Так что же это за текст const
в конце строки?
4 ответов
ключевое слово const, показанное после функции, гарантирует вызывающему функцию, что никакие переменные данных-членов не будут изменены.
например, этот класс
// In header
class Node {
public:
Node();
void changeValue() const;
~Node();
private:
int value;
};
/ / in .cpp
void Node::changeValue() const {
this->value = 3; // This will error out because it is modifying member variables
}
есть исключение из этого правила. Если объявить переменную данных-членов изменяемой, она может быть изменена независимо от того, объявлена ли функция const. Использование mutable для редкой ситуации, когда объект объявлен постоянным, но на практике имеет переменные данных-членов, которые необходимо изменить. Одним из потенциальных примеров его использования является кэширование значения, которое может не потребоваться повторять исходное вычисление. Это, как правило, редко... Но хорошо осознавать это.
например, этот класс
// In header
class Node {
public:
Node();
void changeValue() const;
~Node();
private:
mutable int value;
};
/ / in .cpp
void Node::changeValue() const {
this->value = 3; // This will not error out because value is mutable
}
const говорит, что функция не изменит ни один из членов данных this
если они не помечены как изменяемые.
Только функция-член может быть помечена const, поэтому это означает, что ни один из членов не будет изменен внутри функции.
это метод "оборонительного программирования", чтобы помочь защитить от ваших собственных ошибок программирования. С const
против параметра функции вы заявляете, что функция не должна изменять этот параметр, и добавляете const
заставляет компилятор предотвращать непреднамеренное выполнение этого. Аналогично, если вы пишете функцию-член, которая не должна изменяться любой переменные-члены вашего класса, затем вы можете объявить всю функцию const
Как это, и это предотвратит ты от этого.
Это также помогает сделать ваш код самодокументирующимся. Добавление const
в параметр подсказывает пользователю, что эта функция не изменяет этот параметр. Добавление const
функция-член сообщает пользователю ,что "эта функция не изменяет никаких членов класса" (за исключением явно изменяемых).
ограничение доступа к чему-либо, за исключением тех случаев, когда вам действительно это нужно, обычно следует считать хорошей вещью. Это точно по той же причине, почему вы обычно не входите в свою собственную систему как root, даже если вы могли бы, и у вас было бы больше власти, если бы вы это сделали.
на const
ключевое слово после метода означает, что неявное this
параметр (который установлен в адрес объекта, используемого для вызова метода) указывает на постоянный объект.
В C++. функция-член может выглядеть так:
class Foo {
int x;
mutable int y;
public:
void bar () {
Foo *me = this; // * this is an implicit parameter
// that points to the instance used
// to call bar()
assert(&x == &this->x); // * accesses to class members are
// implicitly taken from this
x = 1; // * can modify data members
}
void bar () const {
// Foo *me = this; // * error, since "bar() const" means
// this is a "const Foo *"
const Foo *me = this; // * ok
// x = 1; // * error, cannot modify non-mutable
// members of a "const Foo"
y = 0; // * ok, since y is mutable
}
};
аналог в C будет функциями для доступа к a struct Foo *
и const struct Foo *
соответственно:
struct Foo {
int x;
int y;
};
void Foo_bar (Foo *this) { /* ... */ } /* can modify this->x and this->y */
void cFoo_bar (const Foo *this) { /* ... */ } /* cannot modify this->x nor this->y */
нет mutable
аналоговые в с.