синтаксис/прототип функции 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 аналоговые в с.