C++函数概念解析(2)

数组形参

我们为函数传递一个数组时,实际传递的是这个数组的指针

void print(const int*);
void print(const int[]);//函数的意图是作用于一个数组
void print(const int[10]);

以数组作为形参的函数也必须保证这个数组不越界

使用标记指定数组长度

以C风格字符串为例,函数在遇到空字符时停止

void print(const char*cp)
{if(cp)while(*cp)cout<<*p++;
}

适合有明显结束标记且数据类型不容易混淆,比如一段文章的结尾

使用标准库规范

传递数组首元素指针与尾元素指针也是一种管理数组形参的方法

void print(const int*beg,const int*end)
{while(beg!=end)cout<<*beg++<<endl;
}//输出beg与end之间所有的元素

调用如下:

int j[2]={0,1};
print(begin(j),end(j));

第三种方法是专门定义一个表示数组大小的形参

void print(const int ia[],size_t size)//记录大小的数据类型
{for(size_t i=0;i!=size;++i)//size_t就是专门记录数据大小的数据{cout<<ia[i]<<endl;}
}

调用print函数时

	int j[]={0,1};print(j,end(j)-begin(j))
C++中没有真正的多维数组

C++ 里面更严格来说其实只有数组的数组(又称jagged array),这是为什么呢?在MSDN的第CA1814号文件中找到了答案:

In a multidimensional array, each element in each dimension has the same, fixed size as the other elements in that dimension. In a jagged array, which is an array of arrays, each inner array can be of a different size. By only using the space that’s needed for a given array, no space is wasted.

翻译过来就是:
在多维数组中,每个维度中的每个元素与该维度中的其他元素具有相同的固定大小。在一个锯齿状数组(即数组的数组)中,每个内部数组可以具有不同的大小。通过只使用给定数组所需的空间,不会浪费任何空间。

C#与VB是真正支持多维数组的

main()函数

之前我们的main()函数基本为空,有时候确实需要给main()函数传递形参

int main(int argc,chat *argc[]) 

第一个形参表示的是数组中字符串的数量
第二个形参argv是一个数组,它的元素是指向C风格的字符串的指针

复习一下形参的作用:

它可以看成引用对象的另一个名字,不额外占用空间,效率高

在使用argv中的实参的时候,从argv[1]开始,argv[0]是给保存程序的名字

无法预知有多少个实参的时候

initializer_list形参

void error_msg(initializer_list<string> il)
{for(auto beg=i1.begin();beg!=i1.end();++beg)cout<<*beg<<" ";cout<<endl;
}

省略符形参

void foo(parm_list,...);
void foo(...);
函数的返回值

每个函数都必须有一个返回值吗?答案是否定的

  1. 没有return语句的函数只能用在返回类型是void的函数中,返回void的函数可以不要return函数
  2. 只要函数的返回类型不是void,函数就必须有一个返回值,如果没有返回值,可能导致控制流尚未返回任何值就结束了函数的执行,编译器也无法检查出这一错误
  3. 不要返回局部对象引用或者指针,因为函数完成后,他们的存储空间也随之释放掉
  4. 这条规矩有一个例外,我们允许main()函数没有return语句
左值与右值

一些语言使用左值(l-value)和右值(r-value)的概念。左值具有确定的、可以被获得的内存地址。这意味着左值可以是变量,也可以是对指向特定内存地址的指针解引用(dereference)的结果。例如C语言的表达式(4 + 9),在执行时,计算机生成一个整数值13,但因为程序没有明确指定这个13如何在计算机中存储,所以这个表达式产生一个右值。另一方面,如果一个C程序声明了一个变量x并将x赋值为13,那么表达式(x)的值是13,并且是一个左值

调用一个返回引用的函数得到左值,其他返回类型得到右值

特别的,我们能为返回类型是非常量引用的函数的结果赋值

列表初始化返回值

函数可以返回花括号包围的值的列表,函数不能返回数组,但可以返回数组的指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中函数概念解析(3)

概念&#xff1a; 如果同一作用域里几个函数的名字相同但形参列表不相同&#xff0c;我们称之为重载&#xff08;overload&#xff09; 它们这些函数接受的参数不一样&#xff0c;但执行的操作非常类似&#xff0c;当调用这些函数时&#xff0c;编译器会根据传递的实参类型推断…

python可以帮机器人编程吗_Python如何实现机器人聊天

今天午休的时候&#xff0c;无意之中看了一篇博客&#xff0c;名字叫Python实现机器人&#xff0c;感觉挺有的意思的。于是用其写了一个简单的Python聊天&#xff0c;源码如下所示:# -*- coding: utf-8 -*-import aimlimport sysimport osdef get_module_dir(name):print("…

测试案例6种编写方法_一种编写测试的好方法

测试案例6种编写方法测试。 我最近一直在考虑测试。 作为我对各种项目所做的代码审查的一部分&#xff0c;我已经看到了数千行未经测试的代码。 这不仅是测试覆盖率统计数据指出这一点的情况&#xff0c;更是该项目中根本没有任何测试的情况 。 我一直听到这种悲惨状况的两个原…

python字符串查找匹配_说说在 Python 中,如何找出所有字符串匹配

Regex 对象有一个 findall() 方法&#xff0c;它会返回包含所查找字符串的所有匹配。这与 search() 方法明显不同&#xff0c;search() 将返回一个 Match 对象&#xff0c;其中包含被查找字符串中的 “ 第一次 ” 匹配文本。请看以下示例&#xff0c;注意区分&#xff1a;phone…

类 in C++

我们为什么需要类、 用户在实际编程中传统数据类型往往不能够满足实际需要&#xff0c;我们对经常使用的对象需要自定义一种数据结构来满足调用的需求以便于提高程序运行的效率。 类的组成 数据抽象封装接口实现 这个程序的作用是读取入库书籍的ISBN编号 saledata total;/…

使用Spring MVC应用程序配置嵌入式H2控制台

在上一篇文章中&#xff0c;我们使用嵌入式H2数据库将Spring MVC应用程序部署到Tomcat。 在嵌入式数据库中浏览数据非常困难&#xff0c;因为我们无法连接外部客户端来查看数据。 H2提供了一个Web控制台&#xff0c;我们可以启用它并使用它来浏览数据&#xff0c;如下所示&…

python实践心得体会_“Python自然语言实践”——总结(一),实战

正则表达式在NLP中的基本应用正则表达式的作用&#xff1a;(1)将文档内容从非结构化转为结构化以便后续的文本挖掘(2)去除“噪声”&#xff0c;在处理大量文本片段的时候&#xff0c;有非常多的文字信息与最终输出的文本无关。这些无关的片段称之为“噪声”。1. 匹配字符串在Py…

Hashcat从入门到入土(二)

使用hashcat破解word密码 昨天的文章里给自己挖了一个坑&#xff0c;使用公司电脑显卡还是GT705古董级别的&#xff0c;显卡驱动也没设置好&#xff0c;导致使用hashcat的时候出现了exhausted的问题&#xff0c;导致密码没有算出来&#xff0c;今天我用自己电脑算一下&#xf…

rizomuv缩放排布_RizomUV

第一章:为什么要用RizomUV来解决UV进程课时1:教程简介课时2:为什么要用RizomUV2020课时3:课程框架结构第二章&#xff1a;有哪些准备工作课时4:MAYA桥接工具安装课时5:3DSMAX桥接工具安装课时6:C4D桥接工具安装课时7:Zbrush桥接工具安装课时8:Blender桥接工具安装课时9:桥接工具…

坚实原则:接口隔离原则

以前&#xff0c;我们研究了liskov替代原理。 下一个原则是接口隔离 。 接口隔离原则&#xff08;ISP&#xff09;指出&#xff0c;不应强迫任何客户端依赖其不使用的方法。 想象一下一个接口&#xff0c;在我们的代码库中有很多方法&#xff0c;尽管只有一部分方法被实现&…

将SQL server2019数据库部署在虚拟机上

下载Windows.iso 前段时间由于数据库文件丢失&#xff0c;导致项目再转入新的环境以后需要重新安装SQL server&#xff0c;但是由于win11对SQL server2019支持非常差&#xff0c;申请的SQL server2022的试用资格又迟迟没有批准导致我的数据库始终连不上&#xff0c;于是只能打…

sqoop mysql 安装_Sqoop安装及验证_MySQL

Sqoop安装及验证环境&#xff1a;系统Red Hatlinux 6.4Hadoop版本1.2.1Sqoop版本1.4.4Mysql数据库版本5.6.15通过Sqoop实现Mysql /Oracle与HDFS / Hbase互导数据http://www.linuxidc.com/Linux/2013-06/85817.htm[Hadoop] Sqoop安装过程详解http://www.linuxidc.com/Linux/2013…

restful web_泽西岛的RESTful Web服务

restful web我已经讨论了有关体系结构考虑事项<< link >>的早期文章&#xff0c;以成为可在我的系统/机器上使用的分布式环境上的RESTful系统。 本文我们将讨论如何基于REST体系结构考虑来构建Web服务。 本教程说明了如何使用Tomcat 6&#xff0c;Eclipse和Jersey …

常见操作系统调度算法研究(1)

FIFO FIFO全称是first in first out&#xff0c;是操作系统里面常见的一种算法&#xff0c;他就好比是一堆人在排一个队伍&#xff0c;按照先进先出的规则&#xff0c;谁首先排队谁就可以第一个出去。 它的缺点显而易见&#xff0c;如果第一个进去的家伙任务量过大&#xff0c…

struts2 mysql 乱码_struts2项目插入中文到mysql数据库乱码的解决方法

项目又出了一些小问题&#xff0c;在更新/插入中文数据到mysql数据库时会显示问号。我做了如下工作解决了问题&#xff1a;1. 检查页面编码将所有的jsp页面编码方式、字符集更改为2. 更改数据库字符集/编码方式将mysql配置文件my.ini相关内容改为[mysql]default-character-setu…

常见操作系统调度算法研究(2)

轮转策略 轮转策略&#xff08;Round-Robin&#xff09;简称为RR&#xff0c;在RR里面&#xff0c;每个准备就绪的任务只能在有限的时间内运行&#xff0c;也就是说不管这个任务完成与否&#xff0c;都会切换任务到下一个。 由于它要频繁的切换队列&#xff0c;我们可以把准备…

使用Apache Ignite优化Spark作业性能(第1部分)

快来看看他们是如何工作的&#xff01; 本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 。 如果您对这篇文章感兴趣&#xff0c;请查看本书的其余部分&#xff0c;以获取更多有用的信息。 Apache Ignite提供了几种提高Spark作业性能的方法&#xff1a;Ignite RD…

centos8.2安装mysql_为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8为例

在本文中&#xff0c;我们将向你展示如何在CentOS 8操作系统上安装MySQL 8.0&#xff0c;可从默认的CentOS 8存储库中安装最新版本的MySQL数据库服务器8.0版&#xff0c;CentOS 8还提供了MariaDB 10.3&#xff0c;它是MySQL 5.7的直接替代品&#xff0c;但有一些限制&#xff0…

rust中的堆和栈

堆和栈定义&#xff1a; 在数据结构中&#xff0c;栈是一种可以实现“先进后出”&#xff08;或者称为“后进先出”&#xff09;的存储结构。假设给定栈 S&#xff08;a0&#xff0c;a1&#xff0c;…&#xff0c;an-1&#xff09;&#xff0c;则称 a0 为栈底&#xff0c;an-1…

mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度

相信很多SQL Server DBA或开发人员在重建或重组大表索引时&#xff0c;都会相当郁闷&#xff0c;不知道索引重建的进度&#xff0c;这个对于DBA完全是一个黑盒子&#xff0c;对于系统负载非常大的系统或维护窗口较短的系统&#xff0c;你会遇到一些挑战。例如&#xff0c;你创建…