【c++入门】函数重载,引用,内联函数,auto

函数重载

函数重载概念

什么是函数重载?

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

下面以参数个数,类型,类型顺序分别举例介绍:

 (1)参数类型不同:

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

(2)参数个数不同:

void fun()
{
    cout << "fun()" << endl;
}

void fun(int a)
{
    cout << "fun(a)"<< endl;
}

(3)类型顺序不同:

void f(char a, int b)
{
    cout << "f(char a,int b)" << endl;
}

void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}

在函数调用时,c++会通过判断输入的参数类型,参数个数,参数顺序,自动寻找相匹配的函数进行调用。

注意:

只有满足上面的条件的才是函数重载,如果两个函数的参数类型,个数,顺序都相等,只有返回值类型不一样,这不构成重载,运行会报错。

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

引用

引用概念

引起:简单的讲就是给一个存在的变量取个别名;   比如,你有一个大名,但是在家里,你的家人会习惯性的喊你的小名,不管怎么喊,他们说的都是你自己。

使用方法:

类型& 引用变量名(对象名)=引用实体

    int a = 0;
    //引用:b是a的别名
    int& b = a;
    int& c = b;

    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    cout << "c=" << c << endl;

    c++;
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    cout << "c=" << c << endl;

a,b,c都是同一个变量的不同变量名,它所指向的都是同一个内存地址;

注意:

引用类型必须和引用实体是同种类型的;
 

引用特性

1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体

(1)初始化:

    int x = 0;
    int& y;//没有初始化就会报错;    就好比你喊一个别名,但是你不知道这个别名到底是谁的,也不知道自己喊得是什么。

(2)多个引用:

    int a = 0;
    int& b = a;
    int& c = b;
    //引用:b是a的别名,c也是a的别名;

(3)不能引用多个实体

    int a = 1;
    int b = 2;
    int& c = a;
    int& c = b;

//如果引用多个实体,c是a的别名,c也是b 的别名,那么a和b应该指向同一个地址,但事实是a,b为两个不同变量,相矛盾,所以引用一旦引用一个实体,再不能引用其他实体;

 常引用

 常引用其实2就是权限问题;

权限可以缩小,但是不可以放大;

权限的放大:

    const int m = 0;
    int& n = m;

m的权限的只读,n是m的别名,n的权限的可读可写;不行

你有洁癖,在宿舍床上,你自己也只能脱了鞋子才能上床,但是你室友却直接躺你床上不脱鞋子,这可以吗?肯定是不行的

    const int& n = m;

//这样写是可以的;

权限的缩小:

    int m = 0;
    const int& n = m;

(你在你床上可以穿着鞋躺着,然后你的室友想在你床上坐一下,这肯定是可以的)

传值、传引用效率比较 

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

引用和指针的区别:

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

    int a = 10;
    int& b = a;
    cout << &a << endl;
    cout << &b << endl;

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的

    int a = 10;

    int& b = a;
    b = 20;

    int* p = &a;
    *p = 30;

引用和指针的不同点:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全

内联函数

内联函数概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。

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

int main()

{

int t = 0;
t=add(1, 2);

}

反汇编:

 如果增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的
调用。

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

int main()

{

int t = 0;
t=add(1, 2);

}

反汇编:

 注意:

(1)在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化)

设置:

(2)inline函数的定义和声明不用分离,分离会导致链接错误。

链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl
f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用

 (3)内联函数多用于规模较小,流程直接,频繁调用的函数;

 auto关键词

auto基本介绍

在C++11中,auto是用来自动推导表达式或变量的实际类型的。

auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化

比如:

 根据上面的例子,我们可知:

auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编
译期会将auto替换为变量实际的类型。
 

 当然,随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
1. 类型难于拼写
2. 含义不明确导致容易出错

比如:std::map<std::string, std::string>::iterator it = m.begin();
这里的std::map<std::string, std::string>::iterator是一个类型,但是该类型太长了,特别容
易写错,我们就可以用auto代替:

auto it =m.begin();

 auto使用细则

(1)auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须
加&

int main()
{
int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;


cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;


*a = 20;
*b = 30;
c = 40;
return 0;
}

(2)在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译
器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

void TestAuto()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

 auto不能使用的情况:

1. auto不能作为函数的参数

2.auto不能直接用来声明数组

 补充知识点:

我们平常遍历数组时,使用的是:

for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)

知道了auto关键字,我们就可以:

for(auto i:a)

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

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

相关文章

基于鲲鹏服务器搭建简单的开源论坛系统(LAMP)实践分享

LAMPLinux apache mysql( mariadb) PHP 结合利用华为云弹性负载均衡ELB弹性伸缩AS服务 优点&#xff1a; 将访问流量自动分发到多台云服务器&#xff0c;扩展应用系统对外的服务能力&#xff0c;实现更高水平的应用容错&#xff1b; 根据不同的业务、访问需求和预设策略&…

Java编程常见问题汇总一

系列文章目录 文章目录 系列文章目录前言一、字符串连接误用二、错误的使用StringBuffer三、测试字符串相等性四、数字转换成字符串五、利用不可变对象(Immutable) 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分…

mac电脑用谷歌浏览器对安卓手机H5页面进行inspect

1、mac上在谷歌浏览器上输入 chrome://inspect 并打开该页面。 2、连接安卓手机到Mac电脑&#xff1a;使用USB数据线将安卓手机连接到Mac电脑。 3、手机上打开要的h5页面 Webview下面选择要的页面&#xff0c;点击inspect&#xff0c;就能像谷歌浏览器页面打开下面的页面&#…

大模型时代的具身智能系列专题(七)

北大王鹤团队 王鹤&#xff0c;北京大学前沿计算研究中心助理教授&#xff0c;本科毕业于清华大学&#xff0c;博士毕业于斯坦福大学&#xff0c;师从美国三院院士Leonidas. J Guibas教授。他创立并领导了具身感知与交互实验室(EPIC Lab)&#xff0c;实验室立足三维视觉感知与…

矩阵连乘问题

#include<iostream> using namespace std; #define N 7 void MatrixChain(int p[N],int n,int m[N][N],int s[N][N]) {for(int i1;i<n;i)m[i][i]0;for(int r2;r<n;r)//有多少个相乘(规模){for(int i1;i<n-r1;i){int jir-1;m[i][j]m[i][i]m[i1][j]p[i]*p[i1]*p[j…

【AREngine BUG 解决方法】无法获取有效的相机图像尺寸

近期拿了一台 华为mate20 Pro的手机&#xff0c;在运行AR示例的过程中出现了黑屏。 问题排查 SDK版本&#xff1a;com.huawei.hms:arenginesdk:3.7.0.3 定位 经排查&#xff0c;发现(ARCamera对象的相机内参) getImageDimensions()返回的图像尺寸的width和height都为0。 这…

Vue——初识组件

文章目录 前言页面的构成何为组件编写组件组件嵌套注册 效果展示 前言 在官方文档中&#xff0c;对组件的知识点做了一个很全面的说明。本篇博客主要写一个自己的案例讲解。 vue 官方文档 组件基础 页面的构成 说到组件之前&#xff0c;先大致说明下vue中页面的构成要素。 在…

太速科技-基于XC7V690T的12路光纤PCIe接口卡

基于XC7V690T的12路光纤PCIe接口卡 一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡&#xff0c;用于实现多通道高速光纤数据接收和发送&#xff0c;板卡兼容PCIe 2.0和PCIe 3.0规范&#xff0c;利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信&#xff0c;计算机与板…

小程序内的分包与数据共享

一:数据共享 小程序内的数据共享和vue当中不一样,vue当中的vue实例可以使得所有的组件都能this.store 但是小程序它只有page对象,和组件实例对象.对于vue而言,vue实例可以使得添加的组件都有. 但是page对象页面对象,不能使得页面内部有.只能使得这个页面内能访问.vue实例,会…

数据库 mysql 的彻底卸载

MySQL卸载步骤如下&#xff1a; &#xff08;1&#xff09;按 winr 快捷键&#xff0c;在弹出的窗口输入 services.msc&#xff0c;打开服务列表。 &#xff08;2&#xff09;在服务列表中&#xff0c; 找到 mysql 开头的所有服务&#xff0c; 右键停止&#xff0c;终止对应的…

LLM主流开源代表模型

LLM主流开源大模型介绍 1 LLM主流大模型类别 随着ChatGPT迅速火爆&#xff0c;引发了大模型的时代变革&#xff0c;国内外各大公司也快速跟进生成式AI市场&#xff0c;近百款大模型发布及应用。 目前&#xff0c;市面上已经开源了各种类型的大语言模型&#xff0c;本章节我们…

特征工程技巧—Bert

前段时间在参加比赛&#xff0c;发现有一些比赛上公开的代码&#xff0c;其中的数据预处理步骤值得我们参考。 平常我们见到的都是数据预处理&#xff0c;现在我们来讲一下特征工程跟数据预处理的区别。 数据预处理是指对原始数据进行清洗、转换、缩放等操作&#xff0c;以便为…

vue3状态管理,pinia的使用

​​​​​​​状态管理 我们知道组件与组件之间可以传递信息&#xff0c;那么我们就可以将一个信息作为组件的独立状态&#xff08;例如&#xff0c;单个组件的颜色&#xff09;或者共有状态&#xff08;例如&#xff0c;多个组件是否显示&#xff09;在组件之传递&#xff0c…

大容量异步电机直接转矩(DTC)控制matlab仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; DTC简介 直接转矩控制的基本思想就是利用逆变器所产生的空间电压矢量来控制定子磁链的旋转速度&#xff0c;通过控制定子磁链的走停来改变定子磁链的平均旋转速度的大小&#xff0c;从而改变磁通角的大小进而…

【应用层】域名系统DNS

目录 1、互联网的域名结构 2、域名服务器 域名系统 DNS (Domain Name System) 是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器名字转换为 IP 地址&#xff0c;域名系统其实就是名字系统。 互联网的域名系统 DNS 被设计成为一个联机分布式数据库系统&#xff0c…

使用 zxing 生成二维码以及条形码

需求背景 前期在做项目的时候&#xff0c;有一个需求是说要生成一张条形码&#xff0c;并且呢将条形码插入到 excel 中去&#xff0c;但是之前一直没有搞过找个条形码或者是二维码&#xff0c;最后是做出来了&#xff0c;这里呢就先看看怎么生成&#xff0c;后面再抽时间来写写…

模拟算法专题

特点: 思路比较简单, 主要考察代码能力 模拟算法流程(一定要在演草纸上过一遍流程)把流程转化为代码 优化: 一般是通过找规律 一. 替换所有问号 答案 二. 提莫攻击 答案 三. Z字形变换 答案 四. 外观数列 答案 五. 数青蛙 答案

Accelerate 笔记:保存与加载文件

保存和加载模型、优化器、随机数生成器和 GradScaler 使用 save_state() 将上述所有内容保存到一个文件夹位置使用 load_state() 加载之前通过 save_state() 保存的状态通过使用 register_for_checkpointing()&#xff0c;可以注册自定义对象以便自动从前两个函数中存储或加载 …

css-Ant-Menu 导航菜单更改为左侧列表行选中

1.Ant-Menu导航菜单 导航菜单是一个网站的灵魂&#xff0c;用户依赖导航在各个页面中进行跳转。一般分为顶部导航和侧边导航&#xff0c;顶部导航提供全局性的类目和功能&#xff0c;侧边导航提供多级结构来收纳和排列网站架构。 2.具体代码 html <!-- 左侧切换 --><…

每日一练——分糖果2

1103. 分糖果 II - 力扣&#xff08;LeetCode&#xff09; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* distributeCandies(int candies, int num_people, int* returnSize) {int num 0;int* arr (int*)malloc(sizeof(int)*num_peo…