Не понимайте объявление метода константы

Слишком много C# и слишком мало C++ делают мой ум головокружительным... Кто-либо мог напомнить мне, что означает это объявление C++? А именно, конечная "константа".Большое спасибо.

protected:
     virtual ostream & print(ostream & os) const
5
задан Benoît 16 February 2010 в 10:44
поделиться

4 ответа

Метод const просто получит указатель const this .

В этом случае указатель this будет иметь тип const ThisClass * const вместо обычного типа ThisClass * const .

Это означает, что переменные-члены не могут быть изменены изнутри метода const . Из такого метода нельзя вызывать даже методы, отличные от const . Однако переменная-член может быть объявлена ​​как изменяемая , и в этом случае это ограничение к ней не применяется.

Следовательно, когда у вас есть объект const , компилятор позволит вам вызывать только те методы, которые помечены как безопасные с помощью ключевого слова const .

10
ответ дан 18 December 2019 в 09:07
поделиться

Окончание const означает, что функция print не должна изменять состояние любого из члены класса, в котором он объявлен (и поэтому не могут вызывать какие-либо функции-члены этого класса, которые также не объявлены const ).

В приведенном ниже примере функция print в классе Foo не может изменить ни одну из переменных-членов Foo (если они не объявлены mutable ) и не может вызывать какие-либо неконстантные функции в Foo .

class Foo {
public:
    Foo(string value) { m_value = value; }
protected:
    ostream & print(ostream & os) const {
        m_value = string("foobar"); // won't compile
        os << m_value;
        return os;
    }
private:
    string m_value;
};
4
ответ дан 18 December 2019 в 09:07
поделиться

const в объявлении метода сообщает компилятору, что функция безопасно вызывать константный объект того типа, членом которого является функция. Он также сигнализирует компилятору, что функция не должна изменять состояние объекта и что она не сможет изменить какие-либо переменные-члены, которые не помечены как mutable .

Если вы опустите константу, этот код не будет работать:

const Foo bar;
bar.print(std::cout);  // Will fail to compile unless 'print' is marked const
3
ответ дан 18 December 2019 в 09:07
поделиться

Вы объявляете защищенный виртуальный метод с именем print , который принимает в качестве параметра ссылку на ostream и возвращает ссылку на ostream.

Ключевое слово const означает, что метод не сможет изменить состояние объекта, указатель this будет иметь значение const.

Виртуальный метод - это метод, поведение которого можно переопределить в наследующем классе, в основном ключевое слово virtual дает C ++ возможность поддерживать полиморфизм.

И, наконец, если вы не знаете, что такое ссылка , перейдите сюда

Исходя из C #, я полагаю, вы знаете, что означает защищенный:)

1
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: