C++ 命名空间、域、缺省参数、函数重载、引用、auto、内联函数的知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

news2024/12/23 18:35:47

绪论

        从本章开始我们正式进入到C++的内容,对此如果没有学习过C语言的建议先将C语言系统的学习一遍后再来(已经更新完在专栏就能看到)。

话不多说安全带系好,发车啦(建议电脑观看)


附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要


思维导图:

要XMind思维导图的话可以私信哈


目录

1.C++关键字

2.命名空间(namespace)

2.1命名空间

2.1.1 域:

2.1.2命名空间域的展开:

3.C++的输入和输出

4.缺省参数(默认参数)

5.函数重载

6.引用

6.1引用的定义:

6.2使用场景:

6.3常引用问题

6.4引用的总结:

7.关键字auto

8.范围for

9.内联函数

 10.指针空值nullptr


1.C++关键字

知识点:

C++的关键字的含义和C语言中一样都是有特殊意义的名称,我们在创建变量的时候不能使用相同的名。

细节:

下面是C++中的63个关键字,我们不需要去死记,通过不断学习就自然的记住了。


2.命名空间(namespace)

2.1命名空间

在C语言中会有命名冲突的问题,在c++中为了避免一个项目中不同程序员写的代码(或者程序员写的代码和一个库)发生命名的冲突,就推出了命名空间这个概念来解决命名冲突这个问题。对此命名空间内可以定义变量、函数、结构体、再嵌套一个命名空间  ......

知识点:

2.1.1 域:

域一般分为:全局域、局部域、作用域(C语言已讲)、命名空间域、类域(后面在讲)。

细节:

下面通过代码来展示不同的域:
 

namespace ZYK
{
    int a = -1;//在命名空间的变量,就是命名空间域
}


int a = 1;//全局域

int main()
{
    int a = 0;//在局部变量中就是局部域,和局部变量非常类型
    
    
    return 0;
}
  1. 对于域的使用一般是先:局部域->全局域 
  2. 若加上了 域作用限定符 : “ :: ”的话则会更先执行限定符指定的空间,域作用限定符的使用是:左边是命名空间名,右边则是要执行的变量名
  3. 当没有指定/展开命名空间域时在搜索变量时并不会自动去命名空间域内去搜索,命名空间域时DIY名称的。
  4.  对于全局域来说他的域名是空(即可以不用输入域名,就代表要访问全局域)

2.1.2命名空间域的展开:

知识点:

他的意思和他的名字几乎一样

把一个命名空间进行了展开,直接展开到了全局域中,所以要注意的是如果全局域有和命名空间域相同的变量名时就会报错(命名不明确),对此我们反思到,在一般情况下我们加上这个命名空间就是为了防止这种情况,所以一般我们不会展开(在一多人合作的项目中我们不能进行展开、而在日常自己练习和单独完成的项目我们可以适当的进行展开

基本语法:
using + namesapce + 命名空间名

来展开对应的命名空间

附:当同时定义了多个相同名的命名空间时:

此时会将这几个相同的命名空间进行合并,并且也不能有相同的变量名


                                                下面通过练习来实践:

练习:

1. 在有局部域和全局域以及命名空间域的同时,先执行全局域再执行命名空间域最后访问局部域:

 #define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

namespace ZYK
{
    int a = -1;//在命名空间的变量,就是命名空间域
}
int a = 1;

int main()
{
    int a = 0;
    printf("%d\n", ::a);
    printf("%d\n", ZYK::a);
    printf("%d\n", a);

    return 0;
}

2. 对于嵌套的来说其大体使用方法一样(嵌套的指定即可):

这里就不过多的去叙述了,直接通过代码来展示:

3. 展开命名空间:

namespace ZYK
{
    int a = -1;
}

using namespace ZYK;

int main()
{
    int a = 0;
    printf("%d\n", ::a);
    printf("%d\n", ZYK::a);
    printf("%d\n", a);
    return 0;
}


3.C++的输入和输出

知识点:

std是C++的标准库的命名空间名,C++的标准库的定义和实现都放在了这个命名空间内(和C语言中的 stdio.h 这个头文件有点类似 在std中包含的则是C++标准库的函数)

细节:

上面我们知道了c++中有一个命名空间名std ,他其中包含了许多函数,所以为了使用一个命名空间内的函数。我们就有两种方法也就是域作用限定符来指定/展开命名空间域

但是要注意的是并不是展开/指定了就能使用该函数了,同样要先用#define将头文件的内容给copy过来后,再通过std来间接的访问函数。所以说这两样东西缺一不可。


练习:

1. cout、endl

一般来说cout 和 endl 是同时使用的,

cout:(可以大概的理解成我们程序的那个黑框框)可以将 <<  (流插入运算符) 所流进来的进行打印(类似printf)

endl:其实可以大概的看成  \n 

cout 相较于printf来说:他可以连续一行插入多个数据,并且可以自动识别类型

附:cin流提取运算符(类似scanf)

具体使用方法如下:

第一种方法:

一个正常使用该cout、endl时我们需要加上的条件:

头文件:#include<iostream>  展开std命名空间

优点:可以能更加便捷的使用

缺点:同样直接把一个命名空间打开是一个非常危险的举动

第二种方法:

 此时我们并没有去展开一个命名空间

但是:不要忘记了头文件#include<iostream>

通过指定访问的方法来实现

优点:没有了展开命名空间的风险

缺点:若要多次使用则会些冗杂

第三种方法(也是比较推荐的方法):

这种方法是将所要用到的进行单独的展开,我们可以在常用的对应进行展开,而不常用的直接使用第二种方法,头文件 #include<iostream>(不能省略)

附:自动识别的展示、以及因为自动识别而导致的精度丢失的问题(缺点)

 


附:在c++中可以写c的语法,因c++是兼容c的(所以我们printf和cout混着使用)

4.缺省参数(默认参数)

知识点:

函数的形参部分加上一个初始值(缺省参数),当你没传参数时就直,如果你传了参数那就正常的使用传来进的参数值。

细节:

当我们同时有多个形参时,对于缺省参数的使用情况大概和单个时的情况差不多但是要注意的是:

  1. 传参时是从左往右依次传上去的(所以从左往右的算传几个算几个,若没传就当成缺省参数)
  2. 并且不可以跳跃的来传递参数
  3. 缺省参数必须是从右往左的(即若一半是正常形参一半是缺省形参时,此时正常形参必须在缺省形参的左边,这种形参别称为半缺省型,反之全缺省)

当我们分源管理时我们应该在哪里写这个缺省参数呢

缺省参数应该只写在函数的声明处,而不是写在定义处


练习:

1. 缺省参数的具体应用:

2. 传多个参数时要注意的点

a.不能跳跃传参

b.从左往右传参的

c.半缺省:(缺省参数必须从右往左,因为我们传参是从左往右的)


5.函数重载

知识点:

在C语言中我们无法同时使用多个相同函数名但类型不同的函数,所以c++就对这方面进行了优化,让同名当不同参数类型的函数可以正常使用

细节:

对于函数重载时的参数一般分为三类:

  1. 类型不同
  2. 类型的数量不同
  3. 类型的顺序不同
  4. 总结来说就是两个同名的函数其函数类型不能对应相等即可

 

而对于为什么C语言不能对相同的函数名的函数进行函数调用,而c++却可以

是因为在编译链接阶段 创建的符号表中命名的函数命有区别 ,C语言是直接把函数名命名当成符号表,而c++在生成符号表时的命名规则并不是直接用函数名,而是有不同的命名规则

因此对于C语言来说当出现两个相同函数名时,就会导致链接时冲突、

而对于c++来说就不会出现冲突因为类型的不同而导致的函数命名的不同(在gcc环境下的函数名的命名规则是:_Z3funii   其中_Z是固定的 + 3 是函数名的字符个数 + 函数名 + ii 函数的类型两个整形)


6.引用

知识点:

6.1引用的定义:

       引用不是新定义一个变量,而是给已存在变量取了一个别名,在语法层面上编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。(就像绰号,叫真名和绰号是一样的)

引用的基本语法:引用的对象的类型+&+引用名 =引用的对象 

//整形
    int a = 0;
    int& b = a;

//指针
    int * ptr = NULL;
    int*& rp = ptr;

 细节(注意点):

  1. 在创建引用定义时必须初始化:int& b = a;
  2. 一个变量可以用多个引用(一个人在每个阶段都可能有不同的绰号,但都是指同一个人)
    int main()
    {
        int a = 0;
        int& b = a;
        int& c = a;
    // b 、 c 都是a的引用
    }
  3. 只能一开始进行引用的初始化指定引用对象、后面无法进行修改。(后面修改也只是赋值操作)

6.2使用场景:

  1. 引用做参数
    1. 输出型参数 ,像我们之前在C语言写链表来举例,当需要改变phead时就需要传一个二级指针,但此时我们用到了引用就不用再使用二级指针。
    2. 提高效率,因为引用的物理意义是一个变量的别名,在传参时并不用为其开辟栈帧所以可以提高一定的效率。
  2. 引用做返回值当引用做返回值的时候,返回的就是一个变量的别名,此时在传递回去的过程中就不需要创建临时变量(放到寄存器)的返回,这样就能减少损耗提高效率
    1. 但要小心,引用返回的对象不能在栈里面,否则当出栈帧时就会导致非法访问,一般用于静态区,堆区上的
    2. 可以修改返回值

练习:

1. 通过引用来进行数值的交换(在C语言中我们需要用到指针才能完成)

//指针时:void  Swap(int * a, int * b)
void Swap(int& a, int& b)//此时的a 、 b 是参数的引用
{
	int tmp = a;
	a = b;
	b = tmp;
}
int main()
{
	int a = 10; 
	int b = 20;
	cout << a << ' ' << b << endl;

	Swap(a,b);
	cout << a << ' ' << b << endl;
	return 0;
}


6.3常引用问题

知识点:

常数的引用时要注意的点(此处主要讨论的是const修饰的常变量)

  1. 在引用时,引用的类型相对于引用对象的类型来说只能平移或者降低(注意看注释
  2. 一种特殊情况:

对于上面这种情况,我们需要知道一个新的知识点:需要整形提升、截断他们在赋值前都会先创建一个临时变量,把这个提升、截断后的值放到这个临时变量(寄存器)内,再把这个临时变量的值放到所要赋值的空间中(这样就避免把被赋值进行改变)

临时变量具有常性  ,同理对于函数返回时也是一样的,当我们返回一个临时变量时是有常性的所以需要用到常变量const来修饰

 此时我们有需要注意的点是:当返回值是引用时就不会创建临时变量了。

6.4引用的总结:

知识点:

  1. 在语法层面上我们理解的是引用并不开辟空间,但是在底层来说其原理和指针一样也是需要开辟空间的(我们理解了解底层即可平时就记住语法层面 : 老婆饼里没老婆)底层逻辑一样
  2. 没有引用NULL这种概念,而指针有
  3. sizeof中指针和引用有不同,引用的结果就是引用对象的大小,而指针时地址的大小
  4. 引用和指针的加减不一样
  5. 有多级指针,没有多级引用
  6. 指针需要解引用,而引用操作系统自动处理了
  7. 引用比指针更加安全(指针可能会有野指针的问题)

7.关键字auto

知识点:

一种可以根据左边表达式自动推到出其类型然后定义给变量

具体就用实例来描述:

int main()
{
    int x = 10;
    auto a = &x;//因为地址,所以auto是指针类型
    auto* b = &x;
    auto& c = x;
    cout << typeid(a).name() << endl;//int * 
    cout << typeid(b).name() << endl;//int *
    cout << typeid(c).name() << endl;//int (引用的类型不用加上&)
    *a = 20;
    *b = 30;
    c = 40;
    return 0;
}

此处的 auto 和 auto * 其实是一样的

附:typeid(变量名). name()    这个可以识别输入变量的类型

细节(注意点):

  1. auto的价值是:一般适用于对一些比较长的类型进行auto自动识别化
  2. 使用auto定义变量必须有初始化(在编译阶段编译器根据初始化表达式推倒出表示的类型,其实auto并不是一个类型在编译后会将其改成实际的类型)
  3. auto也可以一次性声明多个变量,但是这几个变量类型必须是相同的(因编译器只对一个类型进行推导)
  4. auto不能用在形参部分来识别类型(编译器无法对参数的实际类型进行推导)(c++14可以作返回值)
  5. auto不能直接对数组进行声明

8.范围for

知识点:

对数组进行遍历

语法: for (数组类型  语法for的变量名  数组名)

细节(注意点):

当把一个数组传进函数时其本质是一个指针(数组名首元素地址)所以在该函数内是不能去使用这个范围for的

通过练习描述:


int main()
{

    int a[] = { 1,2,3,3,4,5,6,7,8,9,10 };

    for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;

    for (auto x : a)// for (数组类型  语法for的变量名  : 数组名)
    {
        cout << x << ' ';

    }
    cout << endl;
}

此时只是依次将数组a中的数据拷贝给x(所以拷贝的无法改变其数组内容)

若想改变在数组a的值就需要加上引用 如下:


9.内联函数

知识点:

内联函数的设立是为了减少一些重复创建栈帧的开销,以inline修饰的函数被叫做内联函数,该函数不会去开辟栈帧,会直接在调用内联函数的地方展开使用。(在C语言中这种简单重复使用的函数一般会用宏来实现,但宏也有其自己的缺点所以c++进行优化创造出来内联函数)

细节:

1.内联函数的具体展现:

当没有使用内联函数时:就会正常的去调用函数,开辟栈帧...

 当使用内联函数后:调用内联函数的地方会直接展开使用(此时就没用call调用函数)。

2.内联函数对于编译器来说是一个建议性的操作,最后是否实现取决于编译器(对于编译器来说:是递归函数/比较长函数他们就不会同意变成内联函数)

3.注意对于一个较大的函数来说,不能使用内联函数,因为内联函数会导致程序的指令变多(直接正常调用此时指令就在函数内并不会变多,而内联函数会将函数展开就会导致指令反而变多,如:假如一个函数的指令是50个,然后又100处地方要调用这个函数,此时对于直接调用函数的指令就是100 + 50 ,假如是内联函数就变成了 100 * 50

4.假如你要分源管理,此时内联函数不要声明和定义分离因为内联函数不需要要调用就不会生成地址而这样就不会进入到符号表,若声明和定义分开就会导致链接错误找不到


 10.指针空值nullptr

知识点:

在c++,其实NULL并不表示空指针而是表示为0(NULL实际是一个宏代表0),所以在c++11中就新引入了一个关键字表空指针nullptr

  

本章完。预知后事如何,暂听下回分解。

持续更新大量C++细致内容,三连关注哈

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

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

相关文章

Linux运维基础

一.vim编辑器 1.编辑器介绍 vi/vim是visual interface的简称,是Linux中最经典的文本编辑器&#xff0c;同图形化界面中的文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择&#xff0c;粗暴理解相当于windows下的记事本。 vim是vi的加强版本,兼容vi的所有…

java版UWB人员定位系统源码,提供位置实时显示、历史轨迹回放、电子围栏、行为分析、智能巡检等功能

运用UWB定位技术开发的人员定位系统源码 文末获取联系&#xff01; 本套系统运用UWB定位技术&#xff0c;开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有效计算复杂环境下的人员与物品的活动信息。 提供位置实时显…

SLAM论文速递【SLAM—— DynaSLAM:动态场景中的跟踪、建图和修复—4.19(1)

论文信息 题目&#xff1a; DynaSLAM:Tracking,Mapping and Inpainting in Dynamic Scenes DynaSLAM:动态场景中的跟踪、映射和修复论文地址&#xff1a; https://arxiv.org/pdf/1806.05620.pdf发表期刊&#xff1a; IEEE Robotics and Automation Letters ( Volume: 3, Issu…

RPC一文精通

基础&#xff1a; http是基于应用层协议&#xff0c;对请求和响应进行规范包装,一次http请求就会进行一次tcp连接和断开连接&#xff0c;属于短链接 udp是异步响应&#xff0c;无需建立连接&#xff0c;就可以发送封装的IP数据包 tcp是基于传输层协议&#xff0c;并规范了三…

Python单向循环链表操作

目录 一、单向循环链表 单向循环链表图 二、单向循环链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&a…

JavaSE 和 Java EE 分别是什么

Java 作为最流行的编程语言受到了许多人的喜爱&#xff0c;其在编程中的地位自不必多说。 对于许多才刚刚入门 Java 的朋友来讲&#xff0c;常常会产生这样的困惑&#xff0c;JavaEE是什么&#xff1f;JavaSE又是什么&#xff1f; Java SE Java SE 是 Java Platform, Standa…

Liunx下进程间通信

文章目录 前言1.进程间通信相关介绍2.管道1.匿名管道2.管道的原理3.通过代码来演示匿名管道4.命名管道5.命名管道的原理6.命名管道代码演示 3.System V共享内存1.共享内存原理2.相关系统接口的介绍与共享内存的代码演示3.共享内存的一些特性 4.system V消息队列与system V信号量…

依赖注入方式

Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法)构造方法 依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程&#xff0c;如果bean运行需要的是数字或 字符串呢? 引用类型简单类型(基本数据类型与String) Spring就…

Primo Ramdisk内存盘工具软件

简介 Primo Ramdisk 软件的主要功能是通过独特的软件算法将物理内存模拟成一个超快速的硬盘&#xff0c;在这个虚拟硬盘上的读写操作均在内存中完成。由于物理内存的访问速度远远超过物理硬盘&#xff0c;因此虚拟硬盘具有非常高的数据读写速度&#xff0c;从而突破系统IO瓶颈&…

“SCSA-T学习导图+”系列:下一代防火墙

本期引言&#xff1a; 近年来&#xff0c;随着数字化业务带给我们高效和便捷的同时&#xff0c;信息暴露面的增加、网络边界的模糊化以及黑客攻击的产业化&#xff0c;使得网络安全事件相较以往成指数级增加。传统防火墙基于五元组的方式对进出网络的数据流量进行访问控制&…

医院影像图像科室工作站PACS系统 DICOM 三维图像后处理与重建

PACS报告系统的主要任务是通过运用不断积累诊断常用语&#xff0c;减轻出报告的劳动强度&#xff0c;并且将报告保存成电子文档以便日后查阅。在PACS的报告系统中&#xff0c;有三种不同层次的方法输入文字—“高级模板”、“分类词条”和“短语词典”。这三种方法的内容都可以…

记一次从JS到内网的横向案例

前言 前段时间参加了一场攻防演练&#xff0c;使用常规漏洞尝试未果后&#xff0c;想到不少师傅分享过从JS中寻找突破的文章&#xff0c;于是硬着头皮刚起了JS&#xff0c;最终打开了内网入口获取了靶标权限和个人信息。在此分享一下过程。 声明&#xff1a;本次演练中&#xf…

C/C++每日一练(20230422)

目录 1. 存在重复元素 &#x1f31f; 2. 组合总和 &#x1f31f;&#x1f31f; 3. 给表达式添加运算符 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日…

java基于J2EE的学生宿舍信息管理系统

本目 录 摘 要 I ABSTRACT II 第一章 绪论 1 1.1课题研究背景 1 1.2课题的目的和意义 1 1.3开发工具及简介 2 1.3.1开发工具 2 1.3.2 JSP技术 3 1.3.3 JavaScript 4 第二章 需求分析 4 2.1可行性分析 4 2.1.1技术的可行性 4 2.1.2经济的…

Faster RCNN系列1——Anchor生成过程

Faster RCNN系列&#xff1a; Faster RCNN系列1——Anchor生成过程 Faster RCNN系列2——RPN的真值与预测值概述 Faster RCNN系列3——RPN的真值详解与损失值计算 Faster RCNN系列4——生成Proposal与RoI Faster RCNN系列5——RoI Pooling与全连接层 一、RPN模块概述 RPN模块…

jsp946+java物流信息管理平台-sqlserver

本系统是一个独立的系统&#xff0c;用来解决物流信息信息的管理问题。采用JSP技术构建了一个有效而且实用的物流信息信息管理平台&#xff0c;目的是为高效地完成对物流信息信息的管理。 1、内部办公功能&#xff1a;包含工作计划、通告管理、公文管理&#xff1b; 包括可以…

手机录音误删怎么恢复?恢复录音,就这么简单!

案例&#xff1a;手机录音删除了还能恢复吗&#xff1f; 【友友们&#xff0c;苹果手机录音删除了还可以恢复吗&#xff1f;里面有一些关于会议记录的录音&#xff0c;不小心被我删了&#xff0c;有哪些方法可以快速恢复录音文件&#xff1f;】 如果您在使用iPhone手机录音时误…

Python小姿势 - ### Python之禅

Python之禅 Python之禅&#xff08;The Zen of Python&#xff09;是Python之父Guido van Rossum所著的一篇文章&#xff0c;总结了Python语言的哲学。 文章开头写道&#xff1a; Beautiful is better than ugly. Explicit is better than implicit. Simple is better than com…

代码随想录--字符串--反转字符串题型

反转字符串 不能给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 我们直接用双指针&#xff0c;一个指头一个指尾&#xff0c;swap交换&#xff0c;然后同时往中间走一步再进入循环交换即可。 反转字符串II 这道题我们容…

linux(18.04)编译安装python3.6的全过程,pip python不与linux系统环境混乱

因为使用要求&#xff0c;使得我需要在linux环境下安装一个独立的python环境&#xff0c;不干扰其他环境。 一&#xff0c;下载python资源包 两种下载方式二选一&#xff0c;谁快选谁 linux下载&#xff1a; 不同的python版本&#xff0c;安装过程是一样的&#xff0c;下载…