(转)http://www.cnblogs.com/fly1988happy/archive/2011/12/14/2286908.html
函数的返回主要分为以下几种情况:
1、主函数main的返回值:
允许主函数main没有返回值就可结束;可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。
2、返回非引用类型:
- 函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。
- 在求解表达式的时候,如果需要一个地方存储其运算结果,编译器会创建一个没命名的对象,这就是临时对象。C++程序员通常用temporary这个术语来代替temporary object。
- 用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。
- 当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。
3、返回引用类型:
- 当函数返回引用类型时,没有复制返回值,相反,返回的是对象本身。
- 千万不要返回局部对象的引用!千万不要返回指向局部对象的指针!
当函数执行完毕时,将释放分配给局部对象的存储空间。此时对局部对象的引用就会指向不确定的内存!返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。
- 返回引用时,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。
正确的方式
int& abc(int a, int b, int c, int& result)
{
result = a + b + c;
return result;
}
错误的方式
int& abc(int a, int b, int c)
{
return a + b + c;
}
4、返回const类型
由于返回值直接指向了一个生命期尚未结束的变量,因此,对于函数返回值(或者称为函数结果)本身的任何操作,都在实际上,是对那个变量的操作,这就是引入const类型的返回的意义。当使用了const关键字后,即意味着函数的返回值不能立即得到修改!如下代码,将无法编译通过,这就是因为返回值立即进行了++操作(相当于对变量z进行了++操作),而这对于该函数而言,是不允许的。如果去掉const,再行编译,则可以获得通过,并且打印形成z = 7的结果。
代码
include <iostream>
include <cstdlib>
const int& abc(int a, int b, int c, int& result)
{
result = a + b + c;
return result;
}
int main()
{
int a = 1; int b = 2; int c=3;
int z;
abc(a, b, c, z)++; //wrong: returning a const reference
cout << "z= " << z << endl;
return 0;
}
5、例子
下面是一个段有错误的代码,找出其中的错误。
错误代码
#include <iostream>
using namespace std;
int val()
{
int i = 1;
return i;
}
int & ref()
{
int &i = j;
return i;
}
int main()
{
int vv = val();
int & rv = val();
int vr = ref();
int & rr = ref();
return 0;
}
正确代码
#include <iostream>
using namespace std;
int j=3;//j是全局变量
int val()
{
int i = 1;
return i;
}
int & ref()
{
// int j=3;j不能是局部变量!
int &i = j;
return i; //不能返回局部对象的引用
}
int main()
{
int vv = val();
int rv = val();//int &rv = val()错误!val()返回的是一个int型的数,而给引用&rv 赋值的必须是一个同类型的变量。
int vr = ref();
int & rr = ref();
cout<<vv<<endl;
cout<<rv<<endl;
cout<<vr<<endl;
cout<<rr<<endl;
return 0;
}
分享到:
相关推荐
4. **第五章 函数.ppt** - 函数是C++中复用代码的重要手段,这部分可能包括函数的定义、参数传递、返回值以及函数重载的概念。 5. **第六章 程序结构.ppt** - 可能涉及C++中的命名空间、预处理器指令、文件包含和...
对于`x = 9999`,将其转换为二进制(111111111111),可以看出有8个`1`,所以函数返回值是8。这个函数通常用于计算位图中的连续1的个数。 - 第二个问题是关于C++的**引用**。引用是一个已存在对象的别名,它不占...
当通过基类指针或引用调用虚函数时,会根据实际对象的类型调用相应的函数版本,从而实现了动态绑定。 #### 三、多态性的具体实现案例 ##### 3.1 静态多态案例 在提供的部分代码示例中,我们看到了一个简单的静态...
- **基本类型**:如`short int`、`int`、`long int`、`char`、`float`、`double`、`long double`、`bool`、`void`等,其中`bool`类型用于布尔逻辑运算,`void`类型常用于函数返回值。 - **非基本类型**:包括`enum`...
2. 函数返回值:函数可以通过引用返回一个大对象,避免复制开销。 3. 作为容器(如数组、向量)的迭代器:引用可以使迭代过程更加简洁和高效。 总的来说,引用在C++中提供了安全、高效的代码编写方式,特别是在处理...
在Qt框架中,C++作为其主要编程语言,有时候我们需要在一个函数中返回多个值。C++标准库并不直接支持返回多个值,但可以通过多种方法来实现这一目标。本篇文章将详细探讨在Qt环境中如何调用函数并返回多个值。 1. *...
本压缩包“C++hanshu.rar”包含了关于C++函数的详细资料,特别是与C++函数库和Visual C++相关的知识。 首先,我们来看“C++函数库电子手册.chm”。这个文件通常是一个Windows帮助文件,其中包含了详尽的C++函数库...
全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、 动态对象创建、继承和组合、多态和虚...
【C++课程设计——计算各分数表达式的值】 在本次C++课程设计中,学生将面临一项挑战,即设计一个程序来计算各种分数表达式的值。这个任务旨在帮助学生巩固和提升他们的C++编程技能,特别是涉及到分数运算、文件...
C++函数库是C++编程语言中不可或缺的一部分,它提供了丰富的功能,使程序员能够高效地构建复杂的软件系统。"C++函数库帮助.chm"是一个专门针对C++函数的参考资料,旨在帮助用户快速查找和理解各种C++库函数。CHM文件...
* 返回非引用类型的表达式,如 x++、x+1 * 除字符串字面量之外的字面量,如 11、true 右值引用的特点: * 右值引用就是对一个右值进行引用的类型,需立即初始化,引用只是对该对象的一个别名。 * 右值引用可以对...
C++是一种广泛应用于系统软件开发、游戏编程、嵌入式系统和桌面应用...在后续的学习中,你还将接触到函数的更多特性,如函数指针、重载函数、递归函数以及C++11引入的lambda表达式等,这些都是C++函数功能的重要扩展。
在函数调用中,函数可以有返回值或无返回值,有参数或无参数,函数的定义和调用需遵循一定的格式,参数类型和实参类型需匹配。类的定义包括公共成员、保护成员和私有成员,访问权限修饰符控制成员的可见性。 综上所...
#### 九、C++函数高级特性 - **函数重载**:函数重载允许在同一个作用域内定义多个同名函数,通过不同的参数列表区分它们。 - **成员函数的重载、覆盖与隐藏**:了解成员函数的重载、覆盖与隐藏的区别对于面向对象...
4. 在C++中,引用类型提供了一种访问变量的别名方式。通过引用,可以不用返回值就能将函数的修改反映到实际变量上。 5. C++中的布尔类型用于表示逻辑值,它有两个常量值true和false。理解布尔类型对于编写条件语句...
15. **C++11及更高版本特性**:熟悉C++11、C++14、C++17及更高版本的新特性,如Lambda表达式、右值引用、自动类型推断(`auto`)、协程等,提升代码效率和简洁度。 通过学习和实践这些知识点,C++程序员可以显著...
- **返回语句(Return Statement)**:用于从函数返回值给调用者。如果函数不返回任何值,则可以省略 `return` 语句。 #### 示例解析 接下来,我们通过一个具体的例子来进一步理解函数的概念: ```cpp #include /...
声明常引用的方式是`const 类型标识符 &引用名 = 目标变量名`。常引用可以避免意外修改,提高代码安全性。例如: ```cpp void print(const int& num) { // num = 20; // 错误,尝试修改常引用 } ``` 常引用在处理...