`

C++函数的返回值——返回引用类型&非引用类型

    博客分类:
  • C++
 
阅读更多

(转)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;
} 
复制代码

分享到:
评论

相关推荐

    C++课件完整——包含C++全部内容

    4. **第五章 函数.ppt** - 函数是C++中复用代码的重要手段,这部分可能包括函数的定义、参数传递、返回值以及函数重载的概念。 5. **第六章 程序结构.ppt** - 可能涉及C++中的命名空间、预处理器指令、文件包含和...

    C++笔试题库——部分

    对于`x = 9999`,将其转换为二进制(111111111111),可以看出有8个`1`,所以函数返回值是8。这个函数通常用于计算位图中的连续1的个数。 - 第二个问题是关于C++的**引用**。引用是一个已存在对象的别名,它不占...

    C++语言讲解——多态性(大连理工资深教授)

    当通过基类指针或引用调用虚函数时,会根据实际对象的类型调用相应的函数版本,从而实现了动态绑定。 #### 三、多态性的具体实现案例 ##### 3.1 静态多态案例 在提供的部分代码示例中,我们看到了一个简单的静态...

    Pascal转C++学习笔记——1.基本知识

    - **基本类型**:如`short int`、`int`、`long int`、`char`、`float`、`double`、`long double`、`bool`、`void`等,其中`bool`类型用于布尔逻辑运算,`void`类型常用于函数返回值。 - **非基本类型**:包括`enum`...

    C++函数的定义和调用

    - `&lt;类型名&gt;`:指定了函数返回值的类型,如果是无返回值的函数,可以使用`void`来声明; - `&lt;函数名&gt;`:为函数的名称,遵循C++标识符的命名规则; - `&lt;参数表&gt;`:定义了函数接受的参数列表,参数之间使用逗号分隔; ...

    C++资源——课件及其入门等---一本书--引用的使用

    2. 函数返回值:函数可以通过引用返回一个大对象,避免复制开销。 3. 作为容器(如数组、向量)的迭代器:引用可以使迭代过程更加简洁和高效。 总的来说,引用在C++中提供了安全、高效的代码编写方式,特别是在处理...

    Qt中调用函数如何返回多个值的Qt文件

    在Qt框架中,C++作为其主要编程语言,有时候我们需要在一个函数中返回多个值。C++标准库并不直接支持返回多个值,但可以通过多种方法来实现这一目标。本篇文章将详细探讨在Qt环境中如何调用函数并返回多个值。 1. *...

    C++hanshu.rar_C++函数_c++ 函数库_visual c

    本压缩包“C++hanshu.rar”包含了关于C++函数的详细资料,特别是与C++函数库和Visual C++相关的知识。 首先,我们来看“C++函数库电子手册.chm”。这个文件通常是一个Windows帮助文件,其中包含了详尽的C++函数库...

    C++编程思想——很实用的一本书

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、 动态对象创建、继承和组合、多态和虚...

    C++课程设计——计算各分数表达式的值.docx

    【C++课程设计——计算各分数表达式的值】 在本次C++课程设计中,学生将面临一项挑战,即设计一个程序来计算各种分数表达式的值。这个任务旨在帮助学生巩固和提升他们的C++编程技能,特别是涉及到分数运算、文件...

    C++函数库帮助.chm

    C++函数库是C++编程语言中不可或缺的一部分,它提供了丰富的功能,使程序员能够高效地构建复杂的软件系统。"C++函数库帮助.chm"是一个专门针对C++函数的参考资料,旨在帮助用户快速查找和理解各种C++库函数。CHM文件...

    c++11 右值引用和移动语义(csdn)————程序.pdf

    * 返回非引用类型的表达式,如 x++、x+1 * 除字符串字面量之外的字面量,如 11、true 右值引用的特点: * 右值引用就是对一个右值进行引用的类型,需立即初始化,引用只是对该对象的一个别名。 * 右值引用可以对...

    C++资源——课件及其入门等---一本书

    C++是一种广泛应用于系统软件开发、游戏编程、嵌入式系统和桌面应用...在后续的学习中,你还将接触到函数的更多特性,如函数指针、重载函数、递归函数以及C++11引入的lambda表达式等,这些都是C++函数功能的重要扩展。

    C++课程设计——计算各分数表达式的值.pdf

    在函数调用中,函数可以有返回值或无返回值,有参数或无参数,函数的定义和调用需遵循一定的格式,参数类型和实参类型需匹配。类的定义包括公共成员、保护成员和私有成员,访问权限修饰符控制成员的可见性。 综上所...

    高质量C++编程指南——教你如何提高C++编程质量

    #### 九、C++函数高级特性 - **函数重载**:函数重载允许在同一个作用域内定义多个同名函数,通过不同的参数列表区分它们。 - **成员函数的重载、覆盖与隐藏**:了解成员函数的重载、覆盖与隐藏的区别对于面向对象...

    30天掌握C++精髓——经典教程

    4. 在C++中,引用类型提供了一种访问变量的别名方式。通过引用,可以不用返回值就能将函数的修改反映到实际变量上。 5. C++中的布尔类型用于表示逻辑值,它有两个常量值true和false。理解布尔类型对于编写条件语句...

    高质量C++编程规范——林锐博士编写

    15. **C++11及更高版本特性**:熟悉C++11、C++14、C++17及更高版本的新特性,如Lambda表达式、右值引用、自动类型推断(`auto`)、协程等,提升代码效率和简洁度。 通过学习和实践这些知识点,C++程序员可以显著...

    C++从零开始(七)——何谓函数

    - **返回语句(Return Statement)**:用于从函数返回值给调用者。如果函数不返回任何值,则可以省略 `return` 语句。 #### 示例解析 接下来,我们通过一个具体的例子来进一步理解函数的概念: ```cpp #include /...

    80页C/C++面试题目.doc

    声明常引用的方式是`const 类型标识符 &引用名 = 目标变量名`。常引用可以避免意外修改,提高代码安全性。例如: ```cpp void print(const int& num) { // num = 20; // 错误,尝试修改常引用 } ``` 常引用在处理...

Global site tag (gtag.js) - Google Analytics