C++函数必备简单知识

news2024/11/14 15:22:29

目录

1、函数的定义与声明

(1)定义

(2)声明

2、指针传参

3、引用

4、函数的引用传参

5、函数重载 overlord

(1)参数数量不同

(2)参数类型不同

6、避免overlord歧义

7、内联函数inline

8、其他总结

(1)默认参数应放在形参列表最后面,设置参数默认值时应从右向左

(2)除函数形参外,其他引用定义时必须赋初始值

(3)函数重载目的

(4)函数体语句较多时不适合声明为内联函数


 

1、函数的定义与声明

(1)定义

int add(int a,int b)

{

int c = a+b;

return c;

}

明确了函数接受什么参数,返回什么值,具体进行什么操作(实现)

(2)声明

int add(int a,int b);

明确了函数接受什么参数和返回什么值(比如上面的int指明返回值类型)

2、指针传参

实质就是指针的值传参

#include <iostream>
using namespace std;

void swap(int* pa, int* pb) 
{
	int temp = *pa;
	*pa = *pb;
	*pb = temp;
}
int main()
{
	int m = 10, n = 20;
	int* pm = &m, * pn = &n;
	swap(pm, pn);
	cout << m << endl << n;
}

指针的值是地址,实际上就是pm和pn对pa和pb的值传参

 可以看到m和n的值已被交换

3、引用

特指左值引用,即给一个已经有名字的变量起别名,不能存在空引用。

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int &b = a, &c = b;
	cout << b << endl; //b是a的一个引用(别名),输出b就相当于输出a的值
	c++;  //c是a的一个引用(别名),c自增就是a自增
	cout << a;
}

可以理解为变量b和c的类型为int & ,叫做整形引用  

输出结果如下:

  

4、函数的引用传参

即形参就是实参的一个别名

#include <iostream>
using namespace std;

void swap(int &a, int &b) 
{
	int temp = a;
	a = b;
	b = temp;
}
int main()
{
	int m = 10, n = 20;
	swap(m, n);
	cout << m << endl<<n;
}

 同样实现了m和n的交换,且代码更简洁

5、函数重载 overlord

多个函数名字相同,参数列表(数量、类型)不同

(1)参数数量不同

#include <iostream>
using namespace std;

int add(int a, int b)
{
	return a + b;
}

int add(int a, int b, int c)
{
	return a + b + c;
}

int main()
{
	cout << add(1, 2) << endl;
	cout << add(1, 2, 3);
}

 根据输出我们可以看出,尽管函数名都为add,但编译器会根据实参的数量自动匹配调用哪个函数

(2)参数类型不同

#include <iostream>
#include <string>
using namespace std;

int myadd(int a, int b)
{
	return a + b;
}

string myadd(int a,string b)
{
	return to_string(a) + b;
}

int main()
{
	cout << myadd(123, 456) << endl;
	cout << myadd(123, "abc");
}

同样,编译器根据实参类型自动匹配需要调用的函数

这里说明一下:

C++中 的 "to_ string " 函数 用于将数字转换为字符串

要使用这个函数只需 #include <string> 

6、避免overlord歧义

不允许仅有返回值不同的函数重载,重载是针对参数列表的。

比如:

#include <iostream>
#include <string>
using namespace std;

int my(int a, int b)
{
	return a + b;
}

string my(int a,int b)
{
	return to_string(a) + to_string(b);
}

int main()
{
	cout << my(123, 456) << endl;
	cout << my(123, 456);
}

可以看到编译器报错了,这样是无法重载的! 

overlord与返回值无关,只要满足

声明时:名字相同;参数列表不同

调用时:不产生匹配歧义

7、内联函数inline

首先要明确一点,inline只是建议,

并不是写了inline关键字就一定会被内联,要看编译器是否采纳;

其次,内联这个动作发生在编译时,是为了提升运行时的效率。

8、其他总结

(1)默认参数应放在形参列表最后面,设置参数默认值时应从右向左

比如:

int func(int a,int b=2)

而 int func(int b=2,int a)则是不对的

(2)除函数形参外,其他引用定义时必须赋初始值

类型 & 变量名:定义一个该类型的引用

& 变量:对变量取地址,得到一个指针

(3)函数重载目的

方便调用方编写代码,提高可读性。

(4)函数体语句较多时不适合声明为内联函数

用函数体语句多少来衡量函数功能的简单与复杂,一般是将功能简单的函数声明为内联函数

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

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

相关文章

Opencv+Python图像像素处理

目录 二值图像的像素访问、修改 单个像素访问、修改 多个像素修改 彩色图像&#xff08;三维数组&#xff09; 像素访问、修改 BGR模式 像素访问、修改 二值图像的像素访问、修改 单个像素访问、修改 import numpy as np import cv2 as cv # 使用Numpy库中的函数zeros()可…

springboot登录验证

案例-登录认证 已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;但没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;今天的主题就是登录认证。 最终要实现的效果就是用户必须登录之后&#xff0c;才…

Spark学习笔记【shuffle】

本文基本上是大数据处理框架Apache Spark设计与实现的Shuffle部分的学习。以及Spark基础知识Bambrow Shuffle解决啥问题 上游和下游&#xff0c;不同stage&#xff0c;不同的task之间是如何传递数据的。ShuffleManager管理ShuffleWrite和ShuffleRead 分为两个阶段&#xff1…

基于JavaWeb实现的寻码网文章资讯管理系统

一、技术结构 前端&#xff1a;html ajax 后端&#xff1a;SpringBootMybatis-plus 环境&#xff1a;JDK1.8 | Mysql | Maven | Redis 二、功能简介 数据库与代码截图 后端管理-登录页 后端管理-首页 后端管理-文章管理-发布文章 后端管理-文章管理-文章列表 后端管理-文…

Vue快速入门,常用指令,生命周期

Vue常用指令 案例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

MySQL一次大量内存消耗的跟踪

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。文章来源&#xff1a;GreatSQL社区原创 线上使用MySQL8.0.25的数据库&#xff0c;通过监控发现数据库在查询一个视图(80张表的u…

【网络进阶】WebSocket协议

文章目录 1. Web实时技术的应用2. WebSocket协议介绍2.1 WebSocket的工作原理2.2 优点2.3. 使用场景2.4 实现细节 3. WebSocket服务器实现3.1 客户端代码&#xff08;HTML & JavaScript&#xff09;3.2 服务器端代码&#xff08;C&#xff09;3.3 测试结果 1. Web实时技术的…

Qt 智能指针介绍: QSharedPointer、QWeakPointer 、QScopedPointer 、QPointer(附实例)

文章目录 1. 概述2. Qt 中有几种智能指针&#xff1f;2.1 QSharedPointer 实例2.2 QSharedPointer 与 QWeakPointer 实例2.3 QScopedPointer 实例2.4 QPointer 实例 1. 概述 在使用动态内存分配的情况下&#xff0c;需要确保对象的所有权正确地被管理和转移。使用智能指针可以…

【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(一)

【前提简介】 本文档主要总结HarmonyOS开发过程中可能遇到的一些问题解答&#xff0c;主要围绕HarmonyOS展开&#xff0c;包括但不限于不同API版本HarmonyOS开发、UI组件、DevEco Studio、Gitee示例代码等&#xff0c;并将持续更新哦。 【官方FAQ】 【FAQ】HarmonyOS应用及服…

(十二)地理数据库创建——基本组成项及数据加载

地理数据库创建——基本组成项及数据加载 目录 地理数据库创建——基本组成项及数据加载 1.建立数据库中的基本组成项1.1建立要素数据集1.2建立要素类1.2.1建立简单要素类1.2.2建立关系表 1.3建立关系表 2.向地理数据库加载数据2.1导入数据2.1.1导入Shapefile2.1.2导入dBASE 表…

数据结构:顺序表的增、删,查、改实现

1.概念 顺序表是用一段 物理地址连续 的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存 储。在数组上完成数据的增删查改。 2.分类 顺序表一般可以分为&#xff1a; 2.1 静态顺序表&#xff1a;使用定长数组存储元素 这样会造成空间给多了浪费&#x…

ThreadLocal初探

一、ThreadLocal介绍 一、官方介绍 从Java官方文档中的描述&#xff1a;ThreadLocal类用来提供线程内部的局部变量&#xff0c;这种变量在多线程环境下访问&#xff08;通过get和set方法访问&#xff09;时&#xff0c;能够保证各个线程的变量相对独立于其他线程内的变量。Thr…

apple pencil必须要买吗?性价比平替电容笔排行榜

要知道&#xff0c;真正的苹果原装Pencil&#xff0c;价格实在是太贵了&#xff0c;普通的消费者根本买不起。所以&#xff0c;有没有可能出现一种平替的、功能一模一样的、与苹果Pencil一样的电容笔呢&#xff1f;这倒也是。国产的平替笔和苹果Pencil的笔相比&#xff0c;并没…

Wireless-Sensor-Network-master_WSN_无线传感网络(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 近年来&#xff0c;随着对等网络、云计算和网格计算等分布式环境的发展&#xff0c;无线传感器网络&#xff08;WSN&#xff0…

10分钟吃透,python操作mysql数据库的增、删、改、查

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

聊聊汽车OTA测试技术方案

汽车OTA已成为时下热门话题&#xff0c;由于OTA的升级可能会带来一定的风险&#xff0c;针对OTA的测试就尤为重要。本文我们主要通过介绍OTA的发展背景、汽车OTA测试的必要性以及汽车OTA测试内容&#xff0c;为大家分享一套成熟的OTA测试方案。 什么是OTA OTA&#xff08;Over-…

以最大速度将数据迁移至AWS S3存储

数据上云&#xff0c;已经成为企业数据管理发展的必然趋势。 对于企业而言&#xff0c;数据上云“常态化”的趋势&#xff0c;无疑是一个巨大的技术红利。而数据规模爆发式增长的今天&#xff0c;移动和访问云端数据却成为困扰企业的一大难题。不过幸运的是&#xff0c;在对象…

ES6:promise简单学习

一、理解promise Promise将异步执行的程序变成同步执行&#xff0c;所谓的在开发中解决回调嵌套的问题 Promise 是异步编程的一种解决方案 从语法上讲&#xff0c;promise是一个对象 从它可以获取异步操作的消息 从本意上讲&#xff0c;它是承诺&#xff0c;承诺它过一段时间会…

Java入门超详细(内含Java基础 Java高级)

Java基础入门 - 内含Java基础&#xff0c;Java高级 Java 基本介绍Java 学习须知Java 学习文档Java 基础Java 基础语法Java 对象与类Java 基本数据类型Java 变量类型Java 修饰符Java 运算符Java 循环结构Java 条件语句Java switch caseJava 数组Java 日期与时间Java 正则表达式J…

Swift AsyncSequence — 代码实例详解

前言 AsyncSequence 是并发性框架和 SE-298 提案的一部分。它的名字意味着它是一个提供异步、顺序和迭代访问其元素的类型。换句话说&#xff1a;它是我们在 Swift 中熟悉的常规序列的一个异步变体。 就像你不会经常创建你的自定义序列一样&#xff0c;我不期望你经常创建一个…