前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyC++35,引用与结构体

EasyC++35,引用与结构体

作者头像
TechFlow-承志
发布2022-08-26 17:11:31
1530
发布2022-08-26 17:11:31
举报
文章被收录于专栏:TechFlow

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第35篇,来聊聊引用与结构体。

引用与结构体

最后, 来聊聊将引用和结构体。

结构体是我们自定义的复合类型,本质上也是一种变量类型,所以一样可以使用引用。传递结构体引用的方式和其他变量一样:

代码语言:javascript
复制
struct P {
    int x, y;
};

void set_axis(P& a, P& b);

前文当中也曾说过,虽然引用在基本类型上一样适用,但一般在实际使用当中,不在基本变量类型上使用引用。倒不是有什么问题,而是没有必要,毕竟基本变量类型占据的内存太小了,值传递和引用传递带来的差别几乎可以忽略不计。

因此使用得比较多的就是引用传递结构体,因为结构体当中的成员变量往往比较复杂,通过引用传递可以避免结构体的整体拷贝,可以节省时间和内存。

不仅如此,我们还可以通过函数返回引用:

代码语言:javascript
复制
P& return_ref(P& a);

返回引用的目的和传递引用参数的目的是一样的,为了节省时间和内存。

如果函数返回的不是引用,而是结构体的值的话,调用代码可能是这样的:

代码语言:javascript
复制
P m = return_ref(a);

return_ref这个函数的返回结果会先赋值到一个临时的位置,然后再复制给m。这和我们传递结构体参数的开销是一样的,如果我们返回的类型是引用,那么则可以节省掉这个开销。

但是,这里有一个坑。

我们通过函数返回的引用,不能是函数终止时就不存在的内存单元,也就是不能是临时变量。比如下面这个例子就是不行的:

代码语言:javascript
复制
P& return_ref(P& a) {
    P cur = a;
    return cur;
}

我们在函数当中将传入的结构体a拷贝了一份,对这个拷贝体进行了返回。这样的代码从逻辑上看是没有问题的,但问题是我们创建的cur是一个临时变量,当函数返回的时候就会被销毁,不再存在,于是就会导致一些未知的错误。

所以如果要使用函数返回引用的话,一定要返回外部传入的引用或者全局变量的引用,而不能在函数内部临时创建。

除此之外,返回引用还有另外一个坑点,我们来看代码:

代码语言:javascript
复制
P a,b;

return_ref(a) = b;

这样的语法是被允许的,因为return_ref函数返回的是一个引用,我们当然可以对一个引用的值进行修改。有的情况下这一样会产生问题,如果你不想要这样的情况被允许,也有办法,我们可以使用const关键字,将返回的结果限制成不可修改:

代码语言:javascript
复制
const P& return_ref(P& a);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用与结构体
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档