Важен ли порядок возвращаемых методов и модификаторов в C ++? - PullRequest
5 голосов
/ 11 марта 2011

Я столкнулся с ситуацией, которая противоречит моему текущему пониманию методов в C ++.

Я работаю над Айвором Хортоном «Начало Visual C ++ 2010» (Wrox Press). На странице 449, Пример 8_03, метод определен как:

double Volume() const {
    return m_Length * m_Width * m_Height;
}

Я переставил модификаторы как:

double **const** Volume() {
    return m_Length * m_Width * m_Height;
}

Исходя из моего C # и фона Java, я ожидал, что положение const не имеет значения, но при компиляции я получил ошибку:

error C2662: 'CBox::Volume' : cannot convert 'this' pointer from 
             'const CBox' to 'CBox &'

Ошибка исчезает, когда я возвращаю заказ так, как это делает Айвор.

Действительно ли порядок имеет значение, и это не какая-то экзотическая ошибка? Если порядок имеет значение, как помнить правильные позиции?

Спасибо

Scott

Ответы [ 5 ]

9 голосов
/ 11 марта 2011

Когда const ставится после имени метода-члена, это означает, что указатель this является постоянным. То есть в исходном объявлении говорится, что метод CBox::Volume() не изменяет объект CBox, для которого он вызывается.

Наиболее вероятным источником ошибки является то, что функция CBox::Volume() вызывается для const CBox или внутри другого const метода этого CBox.

2 голосов
/ 11 марта 2011

const после имени метода сообщает компилятору, что метод не будет изменять никакие элементы данных (mutable члены являются исключением).

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

2 голосов
/ 11 марта 2011

Отредактировано Чтобы быть более кратким.

const в этих двух контекстах очень отличается.

double Volume() const {
    return m_Length * m_Width * m_Height;
}

Это вызывается, когда экземпляр объекта равен const и возвращает double. Если вы попытаетесь вызвать этот метод с неконстантным экземпляром, он не скомпилируется.

 const myClass obj;
 double d = obj.volume();
 myClass obj2;
 double d = obj2.volume(); // This Fails to compile

С другой стороны ...

double const Volume() {
    return m_Length * m_Width * m_Height;
}

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

myClass obj;
const double d = obj.volume();
const myClass obj2;
const double d = obj2.volume();

(Я должен упомянуть, как мне напомнили ниже, возвращая встроенный константный тип, такой как double, это на самом деле ничего не значит.)

Когда вы оба объявите, будет вызван соответствующий, в зависимости от того, является ли экземпляр постоянным или нет.

myClass obj;
const double d = obj.volume(); // This calls `const double volume()`
const myClass obj2;
double d = obj2.volume(); // This calls 'double volume() const`
2 голосов
/ 11 марта 2011

В этом случае const после имени функции-члена означает, что сама функция имеет значение const - в основном это означает, что вы не можете изменить объект внутри функции-члена.Константа перед функцией-членом означает, что тип возвращаемого значения равен const.(Хотя это может быть сложно для возвращаемых типов, и я не хочу вдаваться в подробности здесь :))

1 голос
/ 11 марта 2011

Да, порядок важен.

В C ++ позиция ключевого слова const будет влиять на то, что является элементом "const".То же самое касается области, в которой используется ключевое слово const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...