数组的引用——用作形参&返回类型时
一、数组的引用
切入:可以将一个变量定义成数组的引用(这个变量和数组的类型要相同)
形式:
int odd[5] = {1, 3, 5, 7, 9};
int (&arr)[5] = odd; //中括号内的数一定要和所引用的数组的维度一样
cout << arr[3] << endl; //等价于odd[3]
解读:注意上面代码中的形式,因为arr引用了数组odd,故arr变成了数组的别名。
二、数组的引用——作为形参
难点:对应形参/实参的写法、怎么运用该形参
写法:
#include <iostream>
#include <vector>
#include <cctype>
#include <string>
#include <iterator>
#include <initializer_list> using namespace std; void print(int (&arr)[])
{
for (auto i : arr)
cout << i << endl;
} int main()
{
int odd[] = {, , , , };
print(odd);
return ;
}
运用:把该形参名视为所绑定的数组的名字使用即可。
优点:节省内存消耗,不用拷贝一份数组,直接使用原数组(甚至可以修改原数组)。
助记:我们不妨以string对象的引用来辅助记忆,因为string就像是一个字符数组,只是它没有确定的容量。
#include <iostream>
#include <vector>
#include <cctype>
#include <string>
#include <iterator>
#include <initializer_list> using namespace std; //void print(int (&arr)[5])
void print(string &arr) //相比数组,只是少了一个[维度]
{
for (auto i : arr)
cout << i << endl;
} int main()
{
// int odd[5] = {1, 3, 5, 7, 9};
string ss = "hello world";
// print(odd);
print(ss);
return ;
}
三、数组的引用——作为返回类型
难点:对应返回类型的写法、怎么使用该返回的引用
知识:因为数组不能被拷贝,所以函数不能返回数组,但可以返回数组的引用(和数组的指针)
先学习一下返回数组的指针,再来看返回数组的引用!
返回数组的引用的写法可以说和返回数组的指针是一毛一样!
写法:
/* 题目:编写一个函数的声明,使其返回包含10个string对象的数组的引用 */
//不用类型别名
string (&func(形参))[];
//类型别名
using arrS = string[];
arrS& func(形参);
//尾置返回类型
auto func(形参) -> string(&)[];
//decltype关键字
string ss[];
decltype(ss) &func(形参);
运用:返回一个数组的引用怎么用??
#include <iostream>
#include <vector>
#include <cctype>
#include <string>
#include <iterator>
#include <initializer_list> using namespace std; int odd[] = {, , , , };
int even[] = {, , , , }; //int (&func(int i))[5]
//auto func(int i) -> int(&)[5]
decltype(odd) &func(int i)
{
return (i % ) ? odd : even;
} int main()
{
cout << func()[] << endl; //输出3
return ;
}
助记:既然返回的数组的引用,而它又只是一个名字(不带维度),我们把它视为所引用的数组(在该函数内返回的那个数组)的别名即可。
补充:返回的是数组的引用,那么函数里也应该返回的是数组!
助记:
int &func(int a, int b)
{
return a > b ? a : b;
}
//函数调用结束后,返回b的引用,返回引用的优点在于不用拷贝一个值返回 int main()
{
int x = , y = ;
int ans = func(x, y); //ans = 4
return ;
}
数组的引用——用作形参&返回类型时的更多相关文章
- 引用模板中的类型时,切记要加上typename声明!!
如题,发现实际操作中太容易忘记了,导致一些莫名其妙的编译错误,故在此记录!
- c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针
1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] ...
- c/c++: c++函数返回类型什么情况带const
c++ 函数的返回类型,包括const 什么时候起作用呢? 函数返回值不想其立即修改的. 例子如下,这是一个简单的避免产生隐形返回变量的方法,abc 的函数返回是引用,main函数中第10行,++ 操 ...
- 一段小代码秒懂C++右值引用和RVO(返回值优化)的误区
关于C++右值引用的参考文档里面有明确提到,右值引用可以延长临时变量的周期.如: std::string&& r3 = s1 + s1; // okay: rvalue referen ...
- ASP.NET Core WebAPI控制器返回类型的最佳选项
前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应.这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项. ASP.NET Core中可 ...
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- 在mvc返回JSON时出错:序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用 的解决办法
在MVC中返回JSON时出错,序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用. public ActionResul ...
- Java中的方法(形参及实参)return返回类型
如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...
随机推荐
- 【HDOJ 5726】GCD(RMQ+二分)
Problem Description Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). ...
- VMware Workstation 安装Vmware tools 是 出现vmware tools unavailable
这个问题是因为虚拟机安装的时候操作系统选择的不对,在Virtual Machine Settings中选择Options,在General中选择正确的操作系统类型 例如Guest operating ...
- 字符编码ascii、unicode、utf-‐8、gbk 的关系
ASIIC码: 计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASIIC码.ASIIC码包括数字大小写字母和常用符号,一共 ...
- vscode调试html文件
1. vscode调试html文件 1.1. 使用Debugger for Chrome进行调试 1.1.1. 基于本地file配置方式调试 1.1.2. 基于服务端配置方式调试 1.1.2.1. 启 ...
- 使用泛型与不使用泛型的Map的遍历
https://www.cnblogs.com/fqfanqi/p/6187085.html
- Zookeeper -- 本地\完全分布式 搭建
准备工作 linux软件:Zookeeper-3.4.12.tar.gz 四台centos系统虚拟机,主机名为:s101~s104 一.本地模式搭建(s101上安装) 1.解压软件压缩包:解压到根目录 ...
- C指针(3)——指向指针的指针(程序讲解)
int **q可以分成两部分,即int* 和 (*q),后面的 “q” 中的* 表示q是一个指针变量,前面的int*表示指针变量q只能存放int*型变量的地址.int** q表示为指针变量q只能存放i ...
- 前端必备的Nginx学习
由于机缘巧合,认识了一些朋友,给我介绍了搬瓦工的网站.买了一个国外的服务器,既可以FQ又拥有了一个搭载 Centos 6 的服务器.一年19.99美元,折合人民币也就130左右,一键搭建.有兴趣可以点 ...
- 成都Uber优步司机奖励政策(1月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM
原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-CO ...