文档章节

C++引用的一篇不完全总结

 时间财富网
发布于 2016/11/15 09:31
字数 1133
阅读 3
收藏 0

C++引用的一篇不完全总结
下面我们来看一篇关于C++引用的一篇不完全总结,希望这一篇文章能够为各位同学带来帮助,具体的细节如下文介绍。
1、引用基础
引用是为对象起了另一个名字,通常将声明符写成"&d"的形式来定义引用类型,其中d是声明的变量名:
int ival = 1024;
int &refVal = ival;
引用必须初始化,引用并非对象,只是已经存在的对象的另一个名字而已。定义了一个引用以后,对其进行的所有操作都是在与之绑定的对象上进行的:
refVal = 2;
int ii = refVal;
引用本身不是对象,所以不能定义引用的引用
本文地址: http://wuyudong.com/2016/11/10/2971.html ,转载请注明出处。
2、指向指针的引用
因为引用本身不是对象,所以自然没有指向引用的指针,但是指针是对象,所有可以定义指针的引用:
int i = 1;
int *p;
int *&r = p; //r是一个对指针p的引用
r = &i;      //r引用了一个指针,即是p指向i
*r = 0;      //解引用r得到i
3、const的引用
可以把引用绑定到const对象上,成为对常量的引用,对常量的引用不能被用作修改它所绑定的对象:
const int ci = 1024;
const int &r1 = ci;
r1 = 42;    //error:r1是对常量的引用
int &r2 = ci;    //error:试图让一个非常量引用指向一个常量对象
初始化常量引用时允许用任意表达式作为初始值,前提是该表达式的结果能转换成引用的类型即可,尤其为一个常量引用绑定非常量的对象、字面值,甚至一个一般的表达式:
int i = 42;
const int &r1 = i;
const int &r2 = 42;
const int &r3 = r1 * 2;
int &r4 =  r1 * 2;    //error:r4是一个普通的非常量引用
4、函数传引用参数
通过引用形参,允许函数改变一个或多个实参的值
void reset(int &i)
{
    i = 0;
}
int j = 23;
reset(j);
cout<<"j = "<<j<<endl;  //j = 0
技巧1:使用引用避免拷贝
拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型(包括IO类型在内)根本就不支持拷贝操作,这时候就可以通过引用形参访问该类型的对象,举个例子:
bool isShorter(const string &s1, const string &s2)
{
    //string 对象可能会非常长,选择引用
    return s1.size() < s2.size();
}
技巧2:使用引用形参返回额外信息
如果有的时候函数需要返回多于一个值,引用参数为这种需求提供了可能。
举个例子:实现一个函数,返回string对象中某个指定字符第一次出现的位置,同时返回该字符出现的总次数
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;
            }
            occurs++;
        }
    }
    return ret;
}
auto index = find_char(s, c, occurs)
5、数组引用形参
C++允许将变量定义成数组的引用,这样,形参可以是数组的引用,此时,引用形参绑定到对应的实参上,也就是绑定到数组上:
void print(int (&array)[10])
{
    for(auto elem : array)
        cout<<elem<<endl;
}
int k[10] = {0,1,2,3,4,5,6,7,8,9};
print(k);
6、函数返回引用
如果函数返回引用,则该引用仅是它所引用对象的一个别名,举个例子:
const string &shorterString(const string &s1, const string &s2)
{
    return s1.size() <= s2.size() ? s1 : s2;
}
其中形参和返回结果均是const string的引用,这样无论调用函数还是返回结果都不会真正拷贝string对象。
调用一个返回引用的函数将得到左值,其他返回类型得到右值,这样我们就能为返回类型是非常量引用的函数的结果赋值:
char &get_val(string &s, string::size_type i)
{
    return s[i];
}
int main()
{
    string s("a bug!");
    cout<<s<<endl;  //输出:a bug
    get_val(s, 0) = 'A';
    cout<<s<<endl; //输出:A bug
    system("PAUSE");
    return 0;
}
本文总结了在c++中引用的各种用法,以后接着补充。需要更多资讯到时间财富网了解。

© 著作权归作者所有

粉丝 2
博文 37
码字总数 57314
作品 0
成都
私信 提问
永远不要相信那些自称懂C++的程序员

近日,国外技术博客lbrady.com 发表了一篇非常有意思的博文。文章认为C++语言庞大而复杂,只有那些在c++开发之旅上吃过许多苦头的程序员才能真正的了解C++。显然作者受到一些刺 激,他的博文...

红薯
2010/03/31
2.2K
61
没有吃够苦头的C++程序员称不上了解C++

转自http://news.csdn.net/a/20100330/217658.html 近日,国外技术博客lbrady.com 发表了一篇非常有意思的博文。文章认为C++语言庞大而复杂,只有那些在c++开发之旅上吃过许多苦头的程序员才...

张明
2010/04/01
934
3
C++ 与复杂性文化

阅读前提: 注意:这边文章是供软件开发专家欣赏,而并非供GreaterThanZero的用户欣赏。 阅读者需要熟悉C++并且至少掌握一门其它面向对象编程语言。 概要: 在我的印象里"复杂性文化"深深植根...

袁不语
2013/09/14
3.9K
26
如何学习一门新的语言二——方法与步骤

之前发表过一篇文章,也是谈如何学习一门新的语言《如何学习一门新的语言》,这篇文章主要的关注点是心态。 今天这篇文章主要的关注点是具体的方法和步骤,是我学习C++和python的一些经验,整...

晨曦之光
2012/06/06
121
0
c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系(二)

上一篇中大概描述了c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系,并贴出了java的实现方案,针对c++版本也只是简单的描述了一下 采用std::bind().这里采用 id+ 指针,通过I...

石头哥哥
2015/02/08
0
3

没有更多内容

加载失败,请刷新页面

加载更多

kubernetes API 访问控制在阿里云容器服务(ACK)上的实践

提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供便捷...

zhaowei121
16分钟前
0
0
从HelloWorld看Knative Serving代码实现

概念先知 官方给出的这几个资源的关系图还是比较清晰的: 1.Service: 自动管理工作负载整个生命周期。负责创建route,configuration以及每个service更新的revision。通过Service可以指定路由流...

迷你芊宝宝
17分钟前
0
0
如何防止http请求数据被篡改

故事的开始,面试官问了我一个问题: 如何防止http请求中数据被篡改? 回答: 1.设置客户端IP黑/白名单 1.1.客户端所有请求,请求到代理服务器(nginx),代理服务器维护黑/白名单的ip,决定是...

太猪-YJ
21分钟前
0
0
好程序员大数据笔记之:Hadoop集群搭建

在学习大数据的过程中,我们接触了很多关于Hadoop的理论和操作性的知识点,尤其在近期学习的Hadoop集群的搭建问题上,小细节,小难点拼频频出现,所以,今天集中总结以下笔记,希望对各位同学...

好程序员IT
28分钟前
0
0
MySql用navcat连接时报错 2509

在8版本以后的MySql默认的加密方式都改为了caching_sha2_password 因此进入mysql的命令行更改加密方式即可 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER......

lanyu96
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部