• 将函数的返回值引用定义为引用


     “将函数的返回值定义为引用”是一种比较有效的做法。

    例如(分析见程序的注释):

    #include<iostream>
    #include<string>
    using namespace std;
    char & get_val(string &str,int i)//返回类型为引用
    {//若去掉返回值的引用,则返回的是一个无名变量,其值是返回内容的一个拷贝而已,见下一个程序。
    	return str[i];
    }
    int main()
    {
    	string s("123456");
    	cout<<s<<endl;
    	get_val(s,2)='a';	//即等价于:str[2]='a',因为get_val(s,2)返回的是引用,故相当于str[2]
    	cout<<s<<endl;
    	return 0;
    }

    对比一下没有返回引用的情况:

    #include<iostream>
    #include<string>
    using namespace std;
    char get_val(string &str,int i)//返回类型不为引用
    {
    	return str[i];
    }
    int main()
    {
    	string s("123456");
    	cout<<s<<endl;
    	char p;
    	p=get_val(s,2);	//因为函数get_val()返回值不是引用,所以必须赋值给一个变量后才能使用。
    	cout<<p<<endl;
    	return 0;
    }

    显然这种函数返回值为引用的方法大有用武之地,最常见的就是用在重载流插入/提取运算符函数中,例如:

    ostream & operate <<(ostream &output, Complex &c)//定义流提取运算符“<<”重载函数
    {
           output<<”(”<<c.real<<”+”<<c.imag<<”i)”<<endl;
           return output;
    }
    
    cout<<c3<<c2;    //调用重载后的"<<",等价于(operate <<(cout, c3))<<c2; 

    因为输出c3后紧接着要输出c2,所以要求cout<<c3(即operate <<(cout, c3))必须返回流提取对象cout,故必须使函数operate <<(cout, c3)的返回值能直接使用,即:必须将函数返回值设置为引用。

    请自行分析下面的程序:

    int &func(int& a)
    {
    	return a;
    }
    
    void main() 
    {
    	int a=0;
    	int b=func(a);
    	printf("&a=%p, &(func(a))=%p, &b=%p\n",&a, &(func(a)), &b);// %p也可以换做%08X,用于输出内存地址
    }

    执行的结果为:

    0012FF7C, 0012FF7C, 0012FF78

    a和b的地址不等。

    返回指针的情形

    例如:

    #include <stdio.h>
    char *RetMemory()
    {
    	char p[]="hello world\n";
    	return p;
    }
    void main( )
    {
    	char *str=NULL;
    	str=RetMemory();
    	printf(str);
    }

    分析:str能得到p吗?不能!因为函数调用结束后p的内存就被回收了,所以最好是利用传参数的形式定义p或者将p定义为全局变量。

    所以要避免返回 指向函数内部定义的变量或字符串常量 的指针。

    end
     

  • 相关阅读:
    Linux C下的正则表达式
    中英文i18 vue参数传递
    es map的用法
    webpack中publicPath问题
    prop中如何获取vue data中的数据 中英文方案
    利用map reduce方法将对象转成数组
    WPF 踩坑笔记2
    WPF 踩坑笔记1
    RabbitMQ 高阶用法 之 x-expire 过期时间设置
    JANUSEC应用网关1.0发布,提供一站式安全交付能力
  • 原文地址:https://www.cnblogs.com/zollty/p/2879293.html
Copyright © 2020-2023  润新知