初始c++:入门基础(完结)

news2024/9/20 4:22:35

打字不易,留个赞再走吧~~~

目录

  • 一函数重载
  • 二引用
  • 1 引⽤的概念和定义
  • 2引⽤的特性
  • 3引⽤的使⽤
  • 三inline
  • 四nullptr

一函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者
类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同
名函数的。

下面三种情况
1、参数类型不同
2、参数个数不同
3、参数类型顺序不同
这些条件都可以作为函数重载的条件,不影响结果,而且输入的参数还可以自动识别类型。

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}

有两种情况不能进行函数重载
1 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
2缺省参数和无参的函数不能 同时定义

// 下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}
int main()
{
Add(10, 20);
Add(10.1, 20.2);
f();
f(10);
f(10, 'a');
f('a', 10);
return 0;
}

二引用

1 引⽤的概念和定义

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,
它和它引⽤的变量共⽤同⼀块内存空间。

具体表示为:类型& 引⽤别名 = 引⽤对象;

C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的<< 和 >>,这⾥引⽤也和取
地址使⽤了同⼀个符号&,⼤家注意使⽤⽅法⻆度区分就可以。

#include<iostream>
using namespace std;
int main()
{
int a = 0;
// 引⽤:b和c是a的别名
int& b = a;
int& c = a;
// 也可以给别名b取别名,d相当于还是a的别名
int& d = b;
++d;
// 这⾥取地址我们看到是⼀样的
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}

在这里插入图片描述

这里看到他们的空间都是一块地方有就是全部a,b,c,d都指向一块空间
在这里插入图片描述

2引⽤的特性

引用有三个特性

• 引⽤在定义时必须初始化
• ⼀个变量可以有多个引⽤
• 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

引⽤在定义时必须初始化

在指针定义时候我们可以int *p;
然后给p赋值。
但是在引用我们必须给引用的值给予一个被引用对象
即int &a=b
给b取别名为a,他们指向同一块空间

⼀个变量可以有多个引⽤

当然我们可以给b取多个别名,即引用
int &a=b;
int &c=b;
int &d=b;

引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

我们上面吧b引用给a了
那么a就不能引用其他值了

3引⽤的使⽤

•引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被
引⽤对象。
• 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
• 引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节
中会继续深⼊讲解。
• 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他
语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,
Java的引⽤可以改变指向。
• ⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开
复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔。

例如下面的代码我们要写swap函数,我们用指针也能完成,但是我们把实参写成引用的形式,看似形参能改变实参了,其实是其引用的值改变实参的。而且这样跟指针相比少开辟了空间,减少了消耗。

void Swap(int& rx, int& ry)
{
int tmp = rx;
rx = ry;
ry = tmp;
}
int main()
{
int x = 0, y = 1;
cout << x <<" " << y << endl;
Swap(x, y);
cout << x << " " << y << endl;
return 0;
}

三inline

⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联
函数就不需要建⽴栈帧了,就可以提⾼效率。
• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展
开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁
调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

在定义函数返回值前我们加上inline的函数被称为内联函数,我们可以理解为在代码执行的时候会生成.exe可执行文件,里面有着我们写的指令,如果是内联函数我们在函数调调用时候会展开函数具体方法,不用使用函数开辟的栈帧。

但是如果函数语句过多,比如是个循环或者是递归语句,我们每次展开的空间过大,编译器会自动不展开,开辟函数栈帧,然后调用。

默认编译器在debug版本是不会展开的,要在编译器设置,而且就算设置了,语句过长,也会不展开,算是编译器的保护机制,防止程序员写出代码不好,占用空间太大。

四nullptr

NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

• C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。不论采取何种
定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的
f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL);
调⽤会报错。

可以看出在c++中null就是0,c语言中则是强制转换为void* 的0.

#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}
void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}
int main()
{
f(0);

f(NULL);
f((int*)NULL);
 	
f(nullptr);

 return 0;
}

在这里插入图片描述

可以看出如果引入nullptr,它不仅可以起到空指针的效果,它还可以自动识别类型,不然每次根据函数方法强转很麻烦。

• C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换
成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被
隐式地转换为指针类型,⽽不能被转换为整数类型。

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

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

相关文章

【数据结构-差分】【hard】力扣995. K 连续位的最小翻转次数

给定一个二进制数组 nums 和一个整数 k 。 k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 &#xff0c;同时把子数组中的每一个 0 都改成 1 &#xff0c;把子数组中的每一个 1 都改成 0 。 返回数组中不存在 0 所需的最小 k位翻转 次数。如果不可能&#xff0c;则返回 -…

代码随想录算法训练营43期 | Day 20 —— 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

代码随想录算法训练营 代码随想录算法训练营43期235.二叉搜索树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点 代码随想录算法训练营43期 235.二叉搜索树的最近公共祖先 解题思路&#xff1a; 二叉搜索树一定是有序的 判断条件&#xff1a; cur>p &…

解决phpstudy无法启动MySQL服务

三种方法 如果说你在小皮里面&#xff0c;启动mysql&#xff0c;发现启动不了&#xff0c;而且你在你自己电脑本地有装过mysql服务&#xff0c;那么可以按照我下面的不走来&#xff0c;按顺序试验1&#xff0c;2&#xff0c;3,三个里面肯定有一个是可以解决的 1.停止本地的mysq…

整整3W字笔记,Redis最核心的秒杀业务、分布式锁、消息队列相关原理一篇文章就搞定(黑马点评项目)

目录 四、 优惠卷秒杀系列功能实现 4.1 全局ID生成器 4.1.1 全局ID生成器的选型 4.1.2 全局ID生成器的实现 4.1.3 全局ID生成器的测试 4.1.4 其他ID生成器的拓展 4.2 利用PostMan模拟管理员后台添加秒杀优惠卷信息 【代码实现】 【PostMan测试】 4.3 优惠卷秒杀下单功能…

Jenkins 构建后操作(Send build artifacts over SSH)

Jenkins 构建后操作(Send build artifacts over SSH) 针对Jenkins部署项目的注意事项 配置Send build artifacts over SSH SSH Server,这是一个系统配置 配置地址&#xff1a;系统管理 -> 系统配置 ->SSH Server 注意1&#xff1a;记得点一下高级里面有一个密码配置&…

10 vue3之全局组件,局部组件,递归组件,动态组件

全局组件 使用频率非常高的组件可以搞成全局组件&#xff0c;无需再组件中再次import引入 在main.ts 注册 import Card from ./components/Card/index.vuecreateApp(App).component(Card,Card).mount(#app) 使用方法 直接在其他vue页面 立即使用即可 无需引入 <templat…

240919-Pip先在线下载不安装+再离线安装

A. 最终效果 # 使用modelscope sdk下载模型 import os os.environ[MODELSCOPE_CACHE] 您希望的下载路径from modelscope import snapshot_download model_dir snapshot_download(opendatalab/PDF-Extract-Kit) print(f"模型文件下载路径为&#xff1a;{model_dir}/model…

【新手上路】衡石分析平台使用手册-认证方式

认证方式​ 用户登录衡石系统时&#xff0c;系统需要对输入的用户名和密码进行验证&#xff0c;保证系统的安全。衡石提供 CAS、SAML2、OAUTH2等多种单点登录认证方式。在 SSO 单点登录中&#xff0c;衡石是服务提供者 SP&#xff08;Service Provider&#xff09;为用户提供所…

synchronized是怎么实现的?

synchronized是JVM的语法糖&#xff0c;主要是通过JVM来控制的。其实现原理依赖于JVM的监视器和对象头。 synchronized修饰方法时&#xff0c;JVM会通过编译完的字节码的访问标记来区分该方法是否被synchronized修饰&#xff0c;在进入方法的时候就会进行获得锁的竞争&#xff…

鸿蒙媒体开发系列06——输出设备与音频流管理

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、音频输出设备管理 有时设备同时连接多个音频输出设备&#xff0c;需要指定音频输…

python 爬虫 selenium 笔记

todo 阅读并熟悉 Xpath, 这个与 Selenium 密切相关、 selenium selenium 加入无图模式&#xff0c;速度快很多。 from selenium import webdriver from selenium.webdriver.chrome.options import Options# selenium 无图模式&#xff0c;速度快很多。 option Options() o…

栈、队列、链表

基于《啊哈&#xff01;算法》和《数据结构》&#xff08;人民邮电出版社&#xff09; 本博客篇幅较多&#xff0c;读者根据目录选择&#xff0c;不理解的可留言和私信。 栈、队列、链表都是线性结构。 三者都不是结构体、数组这种数据类型&#xff0c;我认为更像是一种算法…

面试必备!值得收藏!不容错过的100+ 大语言模型面试问题及答案

引言 大语言模型&#xff08;LLMs&#xff09;现在在数据科学、生成式人工智能&#xff08;GenAI&#xff0c;即一种借助机器自动产生新信息的技术&#xff09;和人工智能领域越来越重要。这些复杂的算法提升了人类的技能&#xff0c;并在诸多行业中推动了效率和创新性的提升。…

Windows如何查看已缓存的DNS信息

Windows server 2016如何查看已缓存的DNS信息 在Windows server 2016系统下&#xff0c;如何查看已缓存的DNS信息呢? 1.打开“运行”&#xff0c;输入cmd&#xff0c;点击“确定” 2.在命令行界面输入ipconfig /displaydns&#xff0c;按回车即可查看已缓存的dns信息

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

面向服务的架构&#xff08;Service Oriented Architecture, SOA&#xff09;实施需要复杂的基础技术作为支撑&#xff0c;伴随着整车硬件资源的集中化、车载以太网等高速通信技术在车内的部署&#xff0c;将在未来一段时间内成为行业技术研究和市场布局的热点。 近年来&#x…

分享几种方式获取免费精致的Live2d模型

文章目录 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09;2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09; 官方提供了一些 Live2D实例模型给大家下载使用 地址&#xff1a;https://ww…

房屋租赁系统源码分享:SpringBoot + Vue 免费分享

这是一套使用 SpringBoot 与 Vue 开发的房屋租赁系统源码&#xff0c;站长分析过这套源码&#xff0c;推测其原始版本可能是一个员工管理系统&#xff0c;经过二次开发后&#xff0c;功能被拓展和调整&#xff0c;现已完全适用于房屋租赁业务。 源码说明&#xff1a; 该系统功…

一键生成高级感PPT封面,首推这个在线AI生成PPT软件!

PPT封面怎么做&#xff1f; ppt封面的重要性不言而喻&#xff0c;就像写文章讲究的“凤头”&#xff0c;一个漂亮的PPT封面&#xff0c;可以吸引观众的注意力&#xff0c;让人有意愿驻足下来听你演讲&#xff0c;才会有后面更多的故事发生。 漂亮的ppt封面怎么做&#xff1f;…

dll文件丢失怎么恢复?10种dll修复方法任你选,一次学会!

dll文件丢失怎么恢复&#xff1f;dll文件丢失在多个Windows 版本中都是常见的问题&#xff0c;包括win7/win8/win10和 win11。这类错误通常与一些特定的dll文件有关&#xff0c;比如MSVCR110.DLL、MSVCR71.DLL、d3compiler_43.DLL、LogiLDA.DLL、MSVCP140.DLL、api-ms-win-crt-…

组装电脑-电脑配置

键盘、鼠标&#xff1a;买一百多的机械盘。 主板 电脑台式机主板是计算机最基本的同时也是最重要的部件之一&#xff0c;它在整个计算机系统中扮演着举足轻重的角色。以下是对它的详细介绍&#xff1a; 基础功能&#xff1a; 主板作为计算机的核心部件&#xff0c;负责连接和…