传引用参数

对于引用的操作实际上是作用在引用所引的对象上:

    int n = 0,i = 42;
    int& r = n;//r绑定了n(即r是n的另一个名字)
    r = 42;//现在n的值是42
    r = 1;//现在n的值和i相同
    i = r;//i的值和n相同

使用引用形参,允许函数改变一个或多个实参的值。

改写reset程序,使其接受的参数是引用类型而非指针:

void reset(int& i) {//i是传给reset函数的对象的另一个名字
    i = 0;//改变i所引用对象的值
}

和其他引用一样,引用形参绑定初始化它的对象。当调用reset函数时,i绑定我们传给函数的int对象,此时改变i也就是改变i所引对象的值,被改变的对象是传入reset的实参。

    int j = 42;
    reset(j);//j采用传引用方式,它的值被改变
    cout << "j = " << j << endl;//输出j=0

使用引用避免拷贝

拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型根本就不支持拷贝操作。当某种类型不支持拷贝操作时,函数只能通过引用形参访问该类型的对象。

比较两个string对象的长度:

  • string对象可能会非常长,应该尽量避免直接拷贝它们
  • 比较长度无须改变string对象的内容
bool isShorter(const string& s1, const string& s2) {
    return s1.size() < s2.size();
}

使用引用参数返回额外信息

一个函数只能返回一个值,然而有时函数需要同时返回多个值,引用形参为我们一次返回多个结果提供了有效的途径。

给函数传入一个额外的引用实参,令其保存字符出现的次数:

//返回s中c第一次出现的位置索引
//引用形参occurs负责统计c出现的总次数
string::size_type find_char(const string& s, char c, string::size_type& occurs) {
    auto ret =s.size();//第一次出现的位置
    occurs = 0;//设置表示出现次数的形参的值
    for (decltype(ret) i=0;i!=s.size();++i )
    {
        if (s[i] == c) {
            if (ret == s.size())
                ret = i;//记录c第一次出现的位置
            ++occurs;//将出现的次数加1
        }
    }
    return ret;//出现的次数通过occurs隐式地返回
}

 

posted @ 2019-07-04 21:17  CodeWithMe  阅读(767)  评论(0)    收藏  举报