【共读Primer】49.[6.3]返回类型和return语句--关于返回值 Page201

值是如何被返回的

返回值用于初始化调用点的一个临时量。

在下面的函数中,返回值的内容是被拷贝到调用点

string make_plural(size_t ctr, const string &word, const string &ending)
{
    return (ctr > 1) ? word + ending : word;
}

在下面的函数中则是将引用型参数作为返回值直接返回了参数的引用

const string & shorterString(const string &s1, const string & s2)
{
    return s1.size() <= s2.size() ? s1 : s2;
}

不要返回局部对象的引用或指针

在函数运行返回后到达返回点,函数运行过程中所占用空间被随之释放。

这个过程意味着在函数返回后所有的函数体内局部变量将不再有效。

我们考虑一下,返回一个不再有效的值的引用或指针,将会引发严重问题

下面我们在做一个 [错误] 示范

// 错误示范
// 错误示范
// 错误示范
const string &manip()
{
    string ret;
    if(!ret.empty())
        return ret;    // 返回一个局部变量的引用,这是一个错误的行为
    else
        return "Empty"; // 这里的返回值也是一个局部临时量(但是在很多编译器优化后这里的返回不会有问题,编译器会把常量字符串进行优化存储)
}

在函数的返回值是引用或者指针类型时,一定要检查返回值是否为局部变量

原文地址:https://www.cnblogs.com/ChattyKu/p/9596079.html

时间: 2024-10-10 06:29:44

【共读Primer】49.[6.3]返回类型和return语句--关于返回值 Page201的相关文章

【足迹C++ primer】11、返回类型和return语句(1)

返回类型和return语句 1.返回数组指针 由于数组不能被拷贝,所以函数不能返回数组. 但是函数可以返回数组的指针或引用. typedef int arrT[10]; using arrT=int[10];<span style="white-space:pre"> </span>//arrT的等价声明 arrT* func(int i);<span style="white-space:pre"> </span>/

返回类型和return语句

return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方.return语句有两种形式: return; return expression; 无返回值函数 没有返回值的return语句只能用在返回类型是void的函数中.返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐含地执行return. 通常情况下,void函数如果想在它的中间位置提前退出,可以使用return语句.return的这种用法有点类似于我们用break语句退出循环. 一个返回类型是vo

返回类型和return语句:无返回值函数,有返回值函数,返回数组指针

重点: 1.return语句功能:终止当前正在执行的函数并将控制权返回到调用该函数的地方.Return语句两种形式: Return: Return expression; 2.返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式地执行return. 3.Void函数如果想中间退出,可以使用return,作用相当于break,提前退出. 4.一个返回类型是void的函数也可以使用return expression形式,不过return语句的expression必须是另

【共读Primer】51.[6.3]返回类型和return语句--列表初始化返回值 Page203

列表初始化返回值 C++11规定可以以列表初始化的方式来进行返回值的表达. vector<string> process() { if(expected.empty()) return {}; else if(expected == actual) return {"funcationX", "okay"}; else return {"funcationX", expected, actual}; } 主函数main的返回值 非vo

【共读Primer】64.[7.3]类类型 Page249

类类型 对于类来说每个类的定义都是唯一的类型,即使两个类的成员完全一样,他们仍然是不同的类型 struct First { int memi; int getMem(){return memi;}; }; struct Second { int memi; int getMem(){return memi;}; }; First obj1; Second obj2 = obj1; // 两个不同的类型无法进行赋值操作 类的声明 同函数一样,类也可以只声明而不定义,这种语法的常用场景是在使用类的地

【共读Primer】27.&lt;4.7&gt;条件运算符 Page134

条件表达式,判断第一个表达式的真假,如果为真,返回冒号左侧的结果,如果为假返回冒号右侧的结果 (a> b ?  a : b) string finalgrade = (grade < 60) ? "fail" : "pass"; // 如果grade小于60则返回fail,否则返回pass 条件运算符的嵌套 // 如果grade值90以上,返回"high pass" ,否则看是否小于60,小于则返回fail,大于等于则返回pass f

【共读Primer】10.&lt;2.3&gt; 复合类型 Page45

C++的复合类型 引用和指针 引用就像是类型的别名 int ival = 1024; int &refVal = ival; // int &refVal2 ; // 报错:引用必须被初始化 int &refVal1 = ival, &refVal2 = ival, &refVal3 = refVal1, Val4=ival; // refVal1/refVal2/refVal3都是引用,其中refVal3用另一个引用进行初始化 // Val4是一个int它并不是引

【共读Primer】19.&lt;3.5&gt; 数组-C风格字符串 Page109

C风格的字符串是指以空字符'\0'结尾的一个字符串. 这种字符串虽然在C++中兼容,但是极易引起内存安全问题,所以不建议使用. 但是作为一个语言特性,我们应该了解它,这样才能在碰到的时候做到心中有数. 3.5.4 C标准库string函数 这里所说的string函数并不是std::string的函数,而是在C的标准库中,对C风格字符串进行操作的一些全局函数. strlen(p); //计算p的长度,不计入空字符结尾 strcmp(p1, p2); // 比较两个字符串p1和p2是否相等,相等返回

【共读Primer】53.[6.4]函数重载 Page207

在同一个作用域内,几个函数名字相同但形参列表不同,我们成为重载(voerloaded)函数. void print(const char *cp); void print(const int *beg, const int*end); void print(const int ia[], size_t size); int j[2] = {0, 1} print("Hello World"); print(j , end(j) - begin(j)); print(begin(j) -