【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,一经查实,立即删除!

相关文章

P8706 [蓝桥杯 2020 省 AB1] 解码--2024蓝桥杯冲刺省一

点击跳转例题 模拟即可 #include <bits/stdc.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl \n #define LL __int128using namespace std;const int N2e610,M1e310,mod998244353,INF0x3f3f3f3f;int a[N],b[N],c[N],pre[N];sign…

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

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

《C++ Primer Plus》《2、开始学习C++》

文章目录 0 前言&#xff1a;1 进入C1.1 main()函数1.2 C注释1.3 预处理器和iostream1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.7 C源代码的格式化 2 C语句2.1 声明语句和变量2.2 赋值语句2.3 cout语句 3 其他C语句3.1使用cin3.2 使用cout进行拼接3.3 类简介 4 函数4.1 …

SSL证书的验证过程

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

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

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

HBase相关面试准备问题

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

面试经典题---76.最小覆盖子串

76.最小覆盖子串 我的解法&#xff1a; 滑动窗口&#xff1a; 使用map1记录子串t中各字符的出现频数&#xff0c;map2记录子串s的滑动窗口[left, right]中各字符的出现频数&#xff1b;当s[right]字符是所需字符时&#xff0c;即t中该字符数量大于等于s的滑动窗口中这一字符的…

技术栈面试综合整理

Git命令详解 设计模式看了又忘&#xff0c;忘了又看 Linux命令 Java集合Map Java基础 JVM面试题 JVM原理最全、清晰、通俗讲解&#xff0c;五天40小时吐血整理_小爷欣欣-CSDN博客_jvm原理 IO 计算机网络 计算机网络2 jsp 多线程 多线程2 大厂 JAVA 高频面试题 Ja…

Mocaverse NFT 概览与数据分析

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

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

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

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

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

leetcode 292. Nim 游戏【数学】

原题链接&#xff1a;292. Nim 游戏 题目描述&#xff1a; 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c; 你作为先手 。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜…

UE4 中 TMap<>与TArray<>的全遍历,及带条件删除

一、UE4 中&#xff0c;TMap<int32,int32> 正向遍历&#xff0c;带条件删除。 注意点&#xff1a;在调用 Remove(it->Key);之后&#xff0c;it 并不会自​​​​​​​动往后移动&#xff0c;仍然需要调用 it&#xff0c;才会指向下一个值。 // TMap<> 正向遍历…

flink写入es的参数解析

ElasticsearchSink内部使用BulkProcessor一次将一批动作(ActionRequest)发送到ES集群。在发送批量动作前&#xff0c;BulkProcessor先缓存&#xff0c;再刷新。缓存刷新的间隔&#xff0c;支持基于Action数量、基于Action大小、基于时间间隔3种策略。BulkProcessor支持在同一次…

悬而未决:daterangepicker设置默认选择日期时间后点确认无值的BUG

daterangepicker有两个BUG&#xff1a; 1、startDate和endDate对设置默认日期没有问题&#xff0c;但对设置默认时间的支持有BUG&#xff01;比如设为 moment().add( 1, day ).hours(8).minutes(20).seconds(0), //如果现在是9点&#xff0c;则设置的时间8&#xff1a;20因为比…

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

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

​LeetCode解法汇总292. Nim 游戏

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 你和你的朋…

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

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

游戏如何选择服务器

游戏如何选择服务器 1、CPU处理器&#xff1a;作为游戏服务器的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元。我们可以将它简单的理解为公司的核心部门&#xff0c;一个核心部门的处理效率&#xff0c;就是核心数和线程数&#xff0c;比如16核心32线程&…

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

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