【01】C++入门

文章目录

  • Ⅰ 命名空间
    • 1. 命名空间域的产生
    • 2. 命名空间域的定义
    • 3. 命名空间域的使用
  • Ⅱ 缺省参数
    • 1. 缺省的概念
    • 2. 缺省的分类
    • 3. 声明和定义不能同时存在缺省参数
  • Ⅲ 函数重载
    • 1. 函数重载概念
    • 2. 编译器如何实现函数重载
  • Ⅳ 引用
    • 1. 引用的概念
    • 2. 引用的特性
    • 3. 引用的使用场景
    • 4. 引用和指针的区别
  • Ⅴ 内联函数
    • 1. 内联函数的概念
    • 2. 内联函数的特性

Ⅰ 命名空间

1. 命名空间域的产生

  • 在开发过程中,常用的名字也就那么多。在同一个域内,如果自己定义的变量和别人已定义好后的变量冲突了,此时就必须更改名字才行。
int a = 10;	// 张三在一个区域内定义的一个变量 a// 若干行代码后......int a = 5;	// 李四在同一个区域内定义的同名变量,此时两个人定义的变量就产生了冲突
  • 上述情况就被叫做命名冲突,而且如果你想更改自己的变量名就又不知道可能会和谁的同域变量名冲突,毕竟取过名的都知道好用的名字大概率给人取走了。
  • 此时就需要使用 namespace 关键字 来划分一块属于自己的命名空间域,在这块区域内就可以对标识符的名称进行本地化,以避免命名冲突或名字污染

2. 命名空间域的定义

1. 命名空间的定义语法

namespace 该命名空间的名字
{// 在这里可以自己定义命名空间的成员// 命名空间的成员包括 变量、函数、自定义类型
}

2. 命名空间的定义示例

namespace T1				// T1 是我自己取的这个空间域的名字
{int a = 10;				// 可以定义变量int b = 5;int Add(int x, int y)	// 可以定义函数{return x + y;}struct Node				// 可以自定义类型{int data;struct Node* next;};
}

3. 命名空间域的使用

如果想使用上面示例的命名空间域 T1 内的成员的话有三种方法:

1. 命名空间名 + 域作用限定符 + 命名空间内的成员

  • 域作用限定符 :: 使用 :: 这个域作用限定符能够指定到某个区域内寻找该变量。
int main()
{printf("%d\n", T1::a); // 指定使用 T1 这块区域内的 a 变量struct T1::Node head;
}
  • 注意:如果某个变量在全局和局部都有定义,一般来说会优先使用局部变量,也可以使用域作用限定符指定使用全局变量
int k = 10;				// 全局变量 kint main()
{int k = 5;			// 局部变量 kprintf("%d\n", k);	// 5 优先使用局部的变量printf("%d\n", ::k);// 10 域作用限定符左边什么都没有表示指定使用全局变量
}

2. 使用 using 将命名空间中的某个成员引入

  • 语法:using 空间域名::空间域的成员名,这样之后使用该成员都是到指定的命名空间域,但是其他的成员还是要用第一种方法才能使用。
using T1::a;	// 之后的代码 a 都是指定使用 T1 这块空间的int main()
{printf("%d %d\n",a, T1::b);
}

3. 使用 using namespace 命名空间名 引入

  • 还是优先使用局部区域的变量,如果该变量不在局部区域,则去命名空间域内搜索该变量。
  • 该方法能够让命名空间域内的成员像普通变量一样直接使用,不需要加上域作用限定符。
using namespace T1;	// 可直接使用 T1 这块空间内的成员int main()
{printf("%d %d\n",a ,b);printf("%d\n", Add(a, b));
}

Ⅱ 缺省参数

1. 缺省的概念

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

在这里插入图片描述

2. 缺省的分类

  • 缺省参数分为全缺省和半缺省两类。

1. 全缺省参数

  • 函数的所有形参都带有一个默认的缺省值。

在这里插入图片描述

2. 半缺省参数

  • 半缺省参数指的是部分缺省,而不是刚好就缺一半。
  • 半缺省参数只能从右往左依次给出,且不能间隔着给

在这里插入图片描述

在这里插入图片描述

3. 声明和定义不能同时存在缺省参数

  • 如果一个函数的声明和定义同时存在缺省参数,且声明和定义提供的缺省参数恰好值不同,此时编译器无法判断该使用谁的缺省值
  • 所以,缺省参数必须只放在声明

在这里插入图片描述

Ⅲ 函数重载

1. 函数重载概念

  • 同一作用域中声明几个功能类似的同名函数,这些函数的形参列表 (形参的个数、类型、类型顺序) 不同,用来对不同的数据类型实现相同的功能。
  • 函数重载与函数的返回值无关,只与函数的形参列表有关

1. 参数类型不同

在这里插入图片描述

2. 参数个数不同

在这里插入图片描述

3. 参数类型顺序不同

  • 本质还是类型不同

在这里插入图片描述

2. 编译器如何实现函数重载

  • 在 C 语言中,是利用函数名去找函数的地址,如果有同名函数,就没法区分。
  • 在 C++ 中,使用函数名修饰规则,在函数名中引入参数类型 (各个编译器自己实现)。
  • 现在主要讲解在 Linux 下的 g++ 编译器是如何实现在函数名中引入参数类型。

Linux 下 g++ 编译器的函数名修饰规则

  • _Z + 函数名长度+ 函数名 + 参数类型1 + 参数类型 2 + 参数类型 n
void Print(char a, int b);// 上述函数使用函数名修饰规则就可以变成 _Z + 5 + Print + c + i → _Z5Printci。
// 使用修饰后的函数名,编译器就可以找到使用者具体是要调用哪个函数
  • 如果形参是指针则将指针类型修饰成 p + 该指针指向的数据类型。
void Func(int* a);	// int* 就可以修饰成 pi,整个函数可以修饰成 _Z4Funcpi
void Func(char* b);	// char* 可以修饰成 pc,整个函数可以修饰成 _Z4Funcpc

Ⅳ 引用

1. 引用的概念

语法数据类型& 别名 = 原变量名

作用:给变量取别名,对这个别名进行得操作能够影响到原变量的内容。

示例

在这里插入图片描述

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

2. 引用的特性

1. 引用在定义时必须初始化

  • 也就是得有原名才能取别名。
int& ra;		// × 如果没有原名,那取别名还有什么意义

2. 一个变量可以有多个引用

  • 即一个变量可以取多个别名,这些别名指的都是该变量。
int a = 10;
int& ra = a;
int& rra = ra;	// ra 和 rra 都是 a 的别名,对这两个别名进行操作都会影响到原变量 a

3. 引用定义后,不能再改变指向

  • 鲁迅已经是周树人的别名了,它就不能再是其他任何人的别名。
int a = 10;
int b = 20;int& ra = a;	// √ 
ra = b;			// × ra 已经是 a 得别名,不能再做其他人得外号了

3. 引用的使用场景

1. 做函数的形参

  • 在 C 语言中,函数形参如果想要改变实参,那么只能使用址传递的方式。实参需要传地址,而形参需要用指针接收。

在这里插入图片描述

  • 在 C++ 中就不用那么麻烦了,将形参定义为引用类型,形参是实参的别名,能直接修改实参的值。

在这里插入图片描述

  • 而如果想要传一级指针变量的地址,那么在 C 语言中就需要使用二级指针来接收,引用就只需要使用对一级指针的引用即可。

在这里插入图片描述

2. 做函数的返回值

  • 局部变量不能用引用返回
int& func()
{int a = 10;	// a 是局部变量,出了该函数就会被销毁return a;	// 如果返回 a 的别名,就相当于野引用
}int main()
{int& ret = func(); // ret 是 a 的别名的别名,ret 成了野引用
}
  • 静态变量 / 全局变量 / 堆上变量 可以用引用返回。这几种类型的变量出了函数的作用域也不会被销毁。
// 返回静态变量的别名
int& func1()	
{static int a = 10;return a;
}// 返回全局变量的别名
int b = 20;
int& func2()	
{return b;
}// 返回堆上变量的别名
int& func3(int*& arr)
{// ...return arr[0];
}int main()
{func1();func2();int* arr = (int*)malloc(4 * sizeof(int));func3(arr);return 0;
}

4. 引用和指针的区别

1. 从语法的角度看

  1. 引用是别名,不用开空间指针是地址,需要开空间存地址
  2. 引用必须初始化,指针可以选择是否初始化,所以指针更容易出现野指针。
  3. 引用不能改变指向,指针可以。
  4. 没有空引用,引用更安全,不容易出现野引用。有空指针,容易出现野指针。
  5. 在 sizeof 中引用结果为引用类型的大小,指针始终为 4 / 8 字节。
  6. 有多级指针,但没有多级引用
  7. 访问实体方式不同,指针需要显式解引用,引用是编译器自己处理。

2. 从底层的角度看

  1. 从汇编层面上看,没有引用,都是指针。引用编译后也会转换成指针。

Ⅴ 内联函数

  • 在调用函数的时候是会开辟栈帧的,如果某一个函数非常频繁的被调用,那么栈空间的压力就会非常大。

在这里插入图片描述

  • 此时就出现了内联关键字 inline,将栈帧的压力转移。

1. 内联函数的概念

  • 在编译的时候,编译器会在调用内联函数的地方将内联函数的实现逻辑展开
  • 没有函数调用建立栈帧的开销,内联函数能够有效提升程序运行的效率。

在这里插入图片描述

2. 内联函数的特性

内联函数的优缺点

inline 内联函数是一种以空间换时间的方式,在编译阶段,会用函数体替换函数调用

  1. 缺点:可能会使编译好的可执行程序变大。假设一个内联函数有 50 行,有 1万 个调用该函数的地方,那么这个文件就会多出 50 万行文本的大小。
  2. 优点:不用每次调用都开辟栈帧,可以提高程序的运行效率。

何时使用内联函数

  • 函数体内容小于等于 75 行时可以选择使用内联函数。

不建议声明和定义分离

  • 如果函数声明有 inline 而函数定义没有,就可能导致链接错误。
  • 因为inline被展开,就没有函数地址了,链接就会找不到。

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

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

相关文章

力扣热门100题刷题笔记 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目链接:5. 最长回文子串 题目描述: 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例: 输入:s "…

SSL证书的验证过程

HTTPS是工作于SSL层之上的HTTP协议,SSL(安全套接层)工作于TCP层之上,向应用层提供了两个基本安全服务:认证和保密。SSL有三个子协议:握手协议,记录协议和警报协议。其中握手协议实现服务器与客户…

远程桌面时连接不上远程计算机是什么问题

在服务器上搭建网络程序时,我们经常会有需要远程连接上服务器进行相关操作,有些用户在远程桌面的时候,有时会有遇上无法连接到远程计算机的情况。 很多用户都曾遇到在远程桌面时出现“未启用对服务器的远程访问”、“远程计算机已关闭”、“…

HBase相关面试准备问题

为什么选择HBase 1、海量存储 Hbase适合存储PB级别的海量数据,在PB级别的数,能在几十到几百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正是因为Hbase良好的扩展性,才为海量数据的存储提供了便利。 2、列式存储 这里的列式存储其实说的…

Mocaverse NFT 概览与数据分析

作者:stellafootprint.network 编译:mingfootprint.network 数据源:Mocaverse NFT Collection Dashboard Mocaverse 是 Animoca Brands 推出的专属 NFT(非同质化代币)系列,包含 8,888 个独特的 "M…

3D DRAM引领存储变革,重塑智能时代计算格局

3D DRAM作为一种应对DRAM技术挑战的解决方案,正逐渐被视为未来内存市场的关键发展方向。与3D NAND类似,3D DRAM采用了立体堆叠技术来突破传统二维平面架构的局限。 在传统DRAM中,存储单元由一个晶体管和一个电容器组成,晶体管负责…

2024杭州国际安防展览会:引领数字城市安全与智能未来

随着科技的不断进步,数字城市已经成为未来城市发展的重要趋势。作为数字城市建设的重要组成部分,安防技术的创新与应用对于保障城市安全、提高生活品质具有重要意义。为此,2024杭州国际安防展览会将于4月份在杭州国际博览中心隆重召开&#x…

C:\Users\ShuYixiao>mysql ‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

这个错误信息表明 mysql 命令在你的系统中没有被识别。这通常意味着 MySQL 没有安装在你的电脑上,或者它的可执行文件路径没有添加到系统的环境变量中。以下是一些解决这个问题的步骤: 确认 MySQL 是否已安装: 如果你还没有安装 MySQL&#x…

PostGIS学习教程二十一:最近领域搜索

PostGIS学习教程二十一:最近领域搜索 注意:本节涉及的功能只在PostGIS2.0及更高的版本可用。 文章目录 PostGIS学习教程二十一:最近领域搜索一、什么是最近邻域搜索?二、基于索引的KNN 一、什么是最近邻域搜索? 一个常…

在java中获取excel的cell值的时候报错

在获取cell的时候,通常会有报错类型不匹配的问题,这是因为你的cell中存储的数据类型和使用的方法不匹配的原因,假如说cell中存储了一个数字,但是使用的cell.getStringCellValue()获取值,就会有如下错误 java.lang.Ill…

微信小程序checkbox多选

效果图 <view class"block"><view class"header"><view class"header-left"><text class"pu-title">数据</text><text class"pu-tip">至少选择一个指标</text></view>&l…

go-redis hash slot 之旅

搭建redis 集群 创建一个网桥 docker network create -d bridge --subnet192.168.148.0/24 --gateway192.168.148.1 -o parenteno1 redis-net通过docker 文件创建redis 集群&#xff0c; 这里注意要不要使用redis 7以上的版本&#xff0c;不然会出问题 version: "3&quo…

Tomcat组件架构与数据流

一、背景与简介 Tomcat我们都知道是一个开源的、实现了大部分Java EE、Servlet、JSP规范的Servlet容器, 允许我们将实现了Serlvet接口的Web程序war包进行部署运行。 但是你有对Tomcat做过细致的学习么? 我相信大部分同学和我一样&#xff0c;之前也是只会进行简单使用&#x…

django线上教育学习平台大数据分析系统python

随着互联网技术不断地发展&#xff0c;网络与大数据成为了人们生活的一部分&#xff0c;而线上教育平台大数据分析作为网上应用的一个全新的体现&#xff0c;由于其特有的便捷性&#xff0c;已经被人们所接受。目前主流的线上教育平台大数据分析服务不仅不明确并且管理盈利较低…

专业课130+总分420+南京大学851信号与系统考研经验南大电子信息与通信系统

经过一年的复习&#xff0c;顺利上岸&#xff0c;被南京大学录取&#xff0c;今年专业课130&#xff0c;总分420&#xff0c;回忆这一年的复习还是有很多经验分享&#xff0c;希望对大家复习有帮助。 专业课&#xff1a; 南京大学851信号与系统难度这几年无论是范围还是难度都…

【MySQL】学习并使用DQL实现排序查询和分页查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-SP91zTA41FlGU0Ce {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

计算机服务器中了DevicData勒索病毒如何解密,DevicData勒索病毒解密流程

网络数据安全一直是企业关心的主要话题&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了DevicData勒索病毒攻击&#xff0c;导致企业计算机服务器瘫痪无法正常工作&#xff0c;严重影响了工作业务开展。经过云天数据恢复中…

【已解决】c++ qt选中该行为什么该列部分变色

笔者开启了QTableView中交替行改变颜色&#xff0c;发现笔者自定义绘制的水平滚动条&#xff0c;在选中后不发生颜色改变&#xff0c;这让笔者很疑惑。笔者查阅资料后发现&#xff0c;自定义绘制的控件&#xff0c;要自身设置颜色。当笔者解决了这个问题时&#xff0c;顺手就将…

【SAR成像】基于RD、CS和ωk算法的合成孔径雷达成像算法原理与实现

基于RD、CS和ωk算法的合成孔径雷达成像算法实现 前言SAR基本概念雷达获取数据的几何关系低斜视角下的回波信号模型 RADARSAT-1主要参数数据预处理数据读取与再封装数据补零 成像算法坐标轴的产生RD算法距离压缩距离徙动矫正方位压缩 CS算法第一次相位相乘 变标后的信号第二次相…

基于若依的ruoyi-nbcio流程管理系统自定义业务实现一种简单的动态任务标题需求

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…