Разница между возвратом по ссылке и указателем в функции const - PullRequest
0 голосов
/ 23 февраля 2020

Я исследую некоторый код C ++ и хотел бы знать, почему этот код не компилируется:

class A {
    int K;
    const int* f(const int* k) const {
        return *k;
    }
};

, а этот код компилируется:

class A {
    int K;
    const int* f(const int* k) const {
        return &K;
    }
};

Я не понимаю, в чем разница, потому что я пытаюсь вернуть const в первом.

Является ли &K const, потому что это адрес?

Ответы [ 3 ]

1 голос
/ 23 февраля 2020

Указатель может содержать адрес памяти объекта. Теперь, поскольку ваша функция const int* f(const int* k) const возвращает указатель const на int, это означает, что вы должны возвращать ей указатель const на int или адрес памяти int.

В первом коде вы разыменовываете указатель и возвращаете его функции, что означает, что вы возвращаете значение. Это не работает по приведенному выше аргументу.

Ваш второй код, однако, компилируется, так как вы возвращаете f адрес объекта (в вашем случае адрес памяти целого числа int K).

0 голосов
/ 23 февраля 2020

Вы, вероятно, смущены синтаксисом здесь. Несмотря на видимость, оператор * возвращает ссылку, а оператор & возвращает указатель. Например:

int k0 = 0;    // declare a regular int variable
int* k1 = &k0; // declare a pointer to int and assign the address of k0 to it
int& k2 = *k1; // declare a reference to int and make it refer to the value pointed by k1

Так что, как вы можете видеть, значения & и * вроде бы переключаются при использовании в выражении, а не в объявлении типа.

0 голосов
/ 23 февраля 2020

В первом случае вы разыменовываете указатель const int* k, что означает, что вы пытаетесь вернуть значение int, тогда как функция const int* f(const int* k) const ожидает вернуть указатель const int*.

Во втором Если вы используете &, который возвращает адрес вашего члена класса int K и поскольку функция const int* f(const int* k) const ожидает, что тип возвращаемого значения будет указателем на const int*, она скомпилируется без проблем.

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