Примечания к чтению "Учебник по C ++" - тип возвращаемого значения и инструкция возврата в главе 03

Автор: Ма Чжифэн
ссылка: https: //zhuanlan.zhihu.com/p/23782715
Источник: знаю, почти
защищено авторским правом автора. Для коммерческих перепечаток, пожалуйста, свяжитесь с автором для авторизации. Для некоммерческих перепечаток укажите источник.

заявление:

  • Содержание статьи собрано и составлено из "C ++ Primer Chinese Edition (5th Edition)", и авторские права принадлежат оригинальной книге.
  • В оригинальной книге есть более подробные и прекрасные интерпретации, пожалуйста, покупайте настоящие книги для обучения.
  • Эта статья предназначена только для обучения и общения, перепечатка в любой форме запрещена.

Способ возврата значения точно такой же, как и способ инициализации переменной или формального параметра.

Возвращаемое значение для временной суммы точки инициализации вызова, временная сумма является результатом вызова функции.

Не возвращать ссылки или указатели на локальные объекты

const string &manip()  
{  
    string ret;  
    if( !ret.empty() )  
    {  
        return ret;  
    }  
    else  
    {  
        return "Empty";  
    }  
}

Два вышеуказанных возврата неверны

  • ret - это локальная переменная, она уничтожается после выполнения функции, поэтому на нее нельзя ссылаться
  • «Пустой» будет использоваться для инициализации временного количества сайта вызова, временное количество является результатом вызова функции, аналогично мы не можем ссылаться на временную сумму

Прямой доступ к членам

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

auto sz = shortString( s1, s2 ).size();
  • С одной стороны, это связано с приоритетом и ассоциативностью вызывающего оператора.
  • С другой стороны, это должно иметь какое-то отношение к временной сумме. Я так понимаю, что член посещает временную сумму, верно?

Ссылка возвращает lvalue

Если функция возвращает объект ссылочного типа, вы можете напрямую присвоить результат вызова функции

getVal( s, 0 ) = 'A';

Фактически присвойте значение объекту, связанному по ссылке

Инициализация списка

vector<string> process()  
{  
    return {"Hi", "bye"};  
}

Мы использовали это, когда чистили Leetcode 01

возвращаемое значение main

Если основная функция не пишет оператор возврата, компилятор автоматически добавит оператор возврата,
который возвращает нам 0, но рекомендуется добавить

Рекурсия

Функция называется сама

int fac( int val )  
{  
    if( val > 1 )  
    {  
        return fac( val - 1 ) * val;  
    }  

    reutrn 1;  
}

Должен быть if, чтобы гарантировать, что существует путь, который не включает рекурсивные вызовы, иначе он закончится бесконечным циклом

Указатель возврата на массив

Поскольку массивы нельзя скопировать, функции не могут возвращать массивы. Но вы можете вернуть указатель или ссылку на массив

Напомним предыдущее определение указателя на массив

int (*p2)[10] = &arr;

Объявление функции, возвращающей указатель на массив, также сложно

Type (*function(parameter_list)[dimension]

Но форма похожа на определение указателя на массив

int (*func(int i))[10];

Такой способ написания неизбежно немного сложен, и в нем легко сделать ошибку. У нас есть три способа упростить

  • Псевдоним типа
  • Тип возврата хвоста
  • decltype

Псевдоним типа

typedef int arrT[10];  
arrT *func( int i );

Тип возврата хвоста

Новый стандарт C ++ 11

auto func( int i ) -> int(*)[10];

decltype

int odd[] = { 1, 3 };  
int even[] = { 2, 4 };  

decltype(odd) *arrPtr( int i )  
{  
    i;  
    return &odd;  
}

Нетрудно заметить, что этот метод имеет ограниченный спектр применения.

рекомендация

отblog.csdn.net/qq_26751117/article/details/53233458