缺省和重载——初识c++

在这里插入图片描述
在这里插入图片描述

.

个人主页:晓风飞
专栏:数据结构|Linux|C语言
路漫漫其修远兮,吾将上下而求索


文章目录

  • C++输入&输出
  • cout 和cin
    • <<
    • >>
  • 缺省参数
    • 全缺省
    • 半缺省
      • 应用场景
      • 声明和定义分离的情况
  • 函数重载
    • 1.参数的类型不同
    • 2.参数的个数不同
    • 3.参数的顺序不同(本质还是类型不同)
  • C++支持函数重载的原理--名字修饰(name Mangling)
    • Linux编译器的命名规则
  • 引用
    • 引用概念
    • 引用特性
    • 引用的作用
      • 1.作为参数
    • 指针和引用的区别


C++输入&输出

cout 和cin

在这里插入图片描述

<<

这里的c意思是console,把数据out到console(控制台)中去,而最后面的endl其实等价与\n,就是换行

在这里插入图片描述

>>

同样的道理cin,把数据in到console(控制台),也就是输入数据到控制台中。

在这里插入图片描述

1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< 
iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。
5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,

缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

全缺省

#include<iostream>
using namespace::std;

void Func(int a = 10 , int b = 20 , int c =30)
{
  cout << "a:" << a << endl;
  cout << "b:" << b << endl;
  cout << "c:" << c << endl << endl;
}


int main()
{
// 没有传参时,使用参数的默认值
// 传参时,使用指定的实参
  Func(1,2,3);
  Func(1,2);
  Func(1);
  Func();
  return 0;
}

在这里插入图片描述

那么可不可以隔着一个数传参呢?答案是不能
在这里插入图片描述

半缺省

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现
#include<iostream>
using namespace::std;

//半缺省参数从右往左依次给出
//半缺省参数不是缺少一半,而是有缺少就是半缺省
void Func(int a , int b = 20 , int c =30)
{
  cout << "a:" << a << endl;
  cout << "b:" << b << endl;
  cout << "c:" << c << endl << endl;
}

int main()
{
  Func(1,2,3);
  Func(1,2);
  Func(1);

  return 0;
}

应用场景

假如我有一个栈,但是不知道要插入多少数据,目前栈的空间是固定的,怎么解决数据的容量问题?

struct stack
{
  int* a;
  int size;
  int capacity;
};

void stackInit(stack* ps)
{
  //容量固定
  ps->a = (int*)malloc(sizeof(int) * 4);
}

void StackPush(stack* ps,int x)
{
}

int main()
{
  //不知道要插入多少个数据
}

用半缺省参数就可以很好的解决这个问题
在这里插入图片描述

声明和定义分离的情况

在声明和定义分离的情况下,那么是在声明处缺省,还是在定义处缺省呢?

//stack.h头文件下的定义
void stackInit(struct stack* ps, int n = 4);

//stack.cpp下的声明
void stackInit(struct stack* ps, int n)
{
    ps->a = (int*)malloc(sizeof(int) * n);
}

应该在头文件下的定义处缺省,因为在运行时,要包含的是头文件,程序在编译的时候会展开头文件,这时候就可以进行缺省调用。而且在声明处还可以判断语法是否正确
如果在定义处缺省,那么在第3个情况下就会出现参数太少的报错情况,达不到缺省。

在这里插入图片描述

如果声名与定义位置同时出现缺省,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。出现重定义报错

在这里插入图片描述

函数重载

c语言不允许同名函数
c++可以,要求,函数名可以相同,但是参数不同,构成函数重载 ,并且会对数据类型自动匹配。

1.参数的类型不同

在这里插入图片描述

2.参数的个数不同

在这里插入图片描述

3.参数的顺序不同(本质还是类型不同)

在这里插入图片描述
c语言不支持重载,链接时,直接用函数名去找地址,有同名函数,区分不开。
那么C++是怎么支持的呢?

C++支持函数重载的原理–名字修饰(name Mangling)

函数名修饰规则,名字中引入参数类型,各个编译器自己实现了一套

Linux编译器的命名规则

因为Linux的规则比较简单,我们先理解一下Linux编译器的规则
在这里插入图片描述
在这里插入图片描述
解释:如果是Add这样的前面就是_Z3,f就是_Z1,后面就都是加上函数名字和数据类型的首字母

正是用类似这样的规则给函数修饰名字,只要参数不同,修饰出来的名字就不一样,就支持了重载。这样链接的时候用这样的名字,就可以找到对应的函数地址

引用

引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。
比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。

int main()
{
  int a = 0;

  //引用,b就是a的别名
  int& b = a;

  cout << &a << endl;
  cout << &b << endl;
  return 0;
}

在这里插入图片描述
注意:引用类型必须和引用实体是同种类型的

引用特性

  1. 引用在定义时必须初始化
    在这里插入图片描述
  2. 一个变量可以有多个引用
    在这里插入图片描述
  3. 引用一旦引用一个实体,再不能引用其他实体
    在这里插入图片描述
    4.引用不能改变指向
    在这里插入图片描述

引用的作用

1.作为参数

//指针传参
void Swap(int* a, int* b)
{
  int tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
}

//引用传参
void Swap(int &a , int &b)
{
  int tmp;
  tmp = a;
  a = b;
  b = tmp;
}

int main()
{
  int x = 0, y = 1;
  Swap(&x, &y);
  cout << "x=" << x << endl;
  cout << "y=" << y << endl;

  Swap(x, y);
  cout << "x=" << x << endl;
  cout << "y=" << y << endl;
}

这里a相当于x的别名,y相当于b

在这里插入图片描述

指针和引用的区别

在这里插入图片描述

typedef struct Node
{
  struct Node* next;
  struct Node* prev;
}Node,*Pnode;

void PushBack(Pnode& phead, int x);

void PushBack(Pnode& phead, int x);
 
int main()
{
  Pnode plist = NULL;
  return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++运算符重载中的引用返回

文章目录 引言原因1.为了支持链式调用2.避免不必要的对象创建和复制3.保持语义一致性 引言 在C编程语言中&#xff0c;运算符重载是一项强大的特性&#xff0c;它允许程序员为自定义类型重新定义或重载已有的运算符&#xff0c;从而使得这些类型能够像内置类型一样使用运算符。…

数学建模之MATLAB使用

1.数值计算和符号计算的认识 我们都知道MATLAB里面存在着数值计算和符号计算&#xff0c;但是两者之间到底是怎样的呢&#xff1f; 举一个很简单的例子&#xff0c;我们在高等数学里面的微积分学习时经常求不定积分&#xff0c;也就是原函数&#xff0c;这个过程实际上进行的…

javaWeb学生宿舍管理系统

一、摘要 本博客介绍了如何使用Spring Boot和MySQL构建一个功能完善的JavaWeb学生宿舍管理系统。该系统分为三个角色&#xff1a;管理员、宿管和学生。管理员拥有对整个系统的全面管理权限&#xff0c;包括学生管理、宿舍管理、入住管理和管理员管理&#xff1b;宿管负责宿舍的…

高级 IO

1、五种IO模型 阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式&#xff1b; 阻塞IO是最常见的IO模型&#xff1b; 非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码&#xff1b; 非阻塞IO往往…

QMT量化交易上手

文章目录 QMT介绍基本使用代码初始化股票和行情交易量化策略示例相关链接QMT介绍 QMT是迅投公司出品量化交易客户端软件,目前只能运行在windows机器上,分为QMT 和 miniQMT两种模式,后者可以采用python API做程序化交易,极大方便了广大散户。这点上比同花顺/通信达好很多。…

Filter、Listener、AJAX

Filter 概念&#xff1a;Filter 表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、 Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控制、统一编码处理、敏感…

百度谷歌301强引蜘蛛池效果怎么样

301强引蜘蛛池效果怎么样 本文 虚良SEO 原创&#xff0c;转载保留链接&#xff01;网址&#xff1a;百度谷歌301强引蜘蛛池效果怎么样 - 虚良SEO 随着搜索引擎优化&#xff08;SEO&#xff09;技术的发展&#xff0c;越来越多的网站开始采用蜘蛛池技术来提高网站的排名和流量。…

电脑如何一键修复所有dll缺失,几种修复dll文件丢失的方法

修复所有DLL&#xff08;动态链接库&#xff09;文件缺失的问题通常不可能通过单一的"一键修复"按钮来实现&#xff0c;因为DLL文件缺失可能由各种不同的原因导致&#xff0c;比如应用程序安装不正确、病毒感染、或系统文件损坏等。 使用内置的系统文件检查器&#x…

科东软件鸿道IntewellV2.3.2版本发布说明

一、软件发布版本信息 版本号&#xff1a;V2.3.2版本发布类型&#xff1a;beta受限版本 二、版本特点 1.合并分支代码 2.RTOS支持X86 64位 三、运行环境推荐 Intewell developer可以运行在windows7及windows10 64位 四、支持硬件列表

覃超老师 算法面试通关40讲

教程介绍 无论是阿里巴巴、腾讯、百度这些国内一线互联网企业&#xff0c;还是 Google、Facebook、Airbnb 等硅谷知名互联网公司&#xff0c;在招聘工程师的过程中&#xff0c;对算法和数据结构能力的考察都是重中之重。本课程以帮助求职者在短时间内掌握面试中最常见的算法与…

软件测试工程师这样面试,90%能拿到offer

如果大家有关注一些测试类的文章的话&#xff0c;肯定会发现很多人都在表示今年行业受到疫情的影响&#xff0c;工作很难找&#xff0c;那情况真的是如此么?你只是不知道面试官的意图是什么&#xff0c;不知道他考察你的点在哪里。只要弄明白面试中的一些固有套路&#xff0c;…

离线linux服务器安装mysql8

本文的服务器环境&#xff1a;openEuler毛坯版的&#xff0c;很多常用的指令都没有预装&#xff0c;比如rpm、tar等等&#xff0c;没有网络坏境&#xff0c;需要自己手动配置本地yum仓库&#xff0c;安装相关指令 1、检查服务器是否已经安装了MySQL 1.1、查询mysql以安装的相关…

uni-app中web-view的使用

1. uni-app中web-view的使用 uni-app中的web-view是一个 web 浏览器组件&#xff0c;可以用来承载网页的容器&#xff0c;uni-app开发的app与web-view实现交互的方式相关简单&#xff0c;应用通过属性message绑定触发事件&#xff0c;然后在web-view的网页向应用 postMessage 触…

docker使用教程

寒假用了docker 2个月没用 结果还重新安装docker 忘了怎么用 为了免得以后忘写下下面内容 # If you dont have a docker installed, youll need to install docker curl -s https://get.docker.com/ | sh # Use pip to install docker-compose pip install docker-compose…

西门子S7-1200/200 Smart的采集方式有哪些?如何快速采集?

​在工业自动化领域中&#xff0c;西门子S7-1200和S7-200 Smart系列PLC因其卓越的性能和广泛的应用而备受瞩目。为了实现对这些PLC设备的精准数据采集与远程控制&#xff0c;我们引入了HiWoo Box这一高效的工业物联网关。 一、采集西门子S7-1200/200 Smart数据的方式有哪些&am…

uniapp开发h5,引入微信开放标签实现h5跳转小程序功能,全网最全最细踩坑记录

先贴上微信开放标签的官方文档 一、概述流程 首先需要在项目中引入微信的sdk&#xff0c;具体引入方式详见我写的另一篇文章&#xff0c;里面包含了引入sdk以及配置wx.config的详细教学以及踩坑记录。如果引入完微信sdk的前提下接下来就是根据微信文档提供的demo来引入开放标…

绘图技巧 | 双变量映射地图可视化绘制方法

本期推文我们绘制不常见的双变量主题地图&#xff0c;该类地图可以很好的在地图上用颜色展示两个变量的信息&#xff0c;相较于单一变量映射地图&#xff0c;此类地图表达的信息更加丰富和全面。本期推文主要涉及的内容如下&#xff1a; 双变量映射地图(Bivariate Choropleth M…

商城小程序项目实现监控的可观测性最佳实践

前言 微信小程序是一种轻量级的应用程序&#xff0c;用户可以在微信内直接使用&#xff0c;无需下载安装。它具有独立的开发框架和生态系统&#xff0c;支持丰富的功能和交互&#xff0c;包括社交、购物、服务等。 观测云对微信小程序的监控能够实时收集性能指标、错误日志和…

su怎么做展厅模型---模大狮模型网

要在SketchUp中创建展厅模型&#xff0c;你可以按照以下基本步骤进行&#xff1a; 绘制基本结构&#xff1a; 使用SketchUp的绘图工具(线条、矩形、圆形等)来创建展厅的基本结构&#xff0c;包括墙壁、地板和天花板等。确保按照实际尺寸和比例进行绘制。 添加家具和展品&…

Mysql新建数据库报错1044

mysql创建数据库报错 1044 - Access denied for user ‘root‘%‘ to database ‘XXX‘ 解决参考&#xff1a;MySQL新建表&#xff1a;1044 - Access denied for user ‘root‘%‘ to database ‘XXX‘终极解决方案_cannot create table [sheet]: 1044 - access denied -CSDN博…