2010-09-19 7 views
4

Что означает const в следующем коде на C++? Что эквивалентно этому в C#? Я код на C#, и я пытаюсь изучить C++.Что здесь обозначает const?

template <class T> class MaximumPQ { 
public: 
virtual ~MaximumPQ() {} 

virtual bool IsEmpty() const = 0;  

virtual void Push(const T&) = 0; 

virtual void Pop() = 0; 
}; 
+4

Пожалуйста, получите [книгу] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), чтобы вы могли правильно изучить C++. – GManNickG

+0

Можно ли предложить один для человека, знакомого с C#? – devnull

+0

Знакомство с C# не имеет значения, они разные языки по какой-то причине. Я рекомендую книгу начинающих, так как вы, по сути, новичок. C# не поможет вам, притворяйтесь, что вы этого не знаете. – GManNickG

ответ

9

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

В принципе, это гарантирует, что метод является свободным от побочных эффектов.

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

В C# нет эквивалентных подписей.

+6

Ну, это не гарантирует никаких побочных эффектов - просто никаких побочных эффектов * на объекте, метод которого называется *. Этот объект может иметь, скажем, 'std :: string *' как поле, и что 'std :: string' может быть изменен (с помощью указателя разыменования), даже если метод, выполняющий измененное, объявляется' const'. –

+0

Если вызов функции не имеет побочных эффектов, зачем звонить? :) – GManNickG

+1

@GMan: Возвращаемое значение не считается побочным эффектом. –

6

IsEmpty() - функция, определяемая константой. Это означает, что указатель this имеет const-квалификацию, поэтому он будет иметь тип const MaxPQ*. Код внутри IsEmpty() не может вызывать какие-либо функции-члены на this, которые сами по себе не являются const-квалифицированными, а также не могут изменять любые элементы данных, которые не являются mutable.

Насколько я знаю, в C# ничего подобного нет.

+0

«const MaxPQ *» - это фактически 'const MaxPQ * const', или' this' не const const, но немодулируемый как специальный дело? –

+1

@Steve: 'this' является rvalue, поэтому он не может быть const-квалифицированным (значения класса non-class никогда не являются константными или нестабильными). Это потому, что это неклассовый тип rvalue, который нельзя изменить. –

+0

@Steve: litb дал хороший пример некоторое время назад.Представьте, что параметр '__this' имеет тип' cv-qualifiers class-name * ', тогда вы' #define this (__this + 0) '. Конечно, это не обязательно то, что есть. – GManNickG

Смежные вопросы