C++入门基础篇
引言
说到编程语言常常听到的就是C语言C++ Java 。C语言是面向过程的,C++是和Java是面向对象的,那么什么是面向对象呢?什么又是面向过程呢?C++是什么?封装、继承、多态是什么?且听我絮絮叨叨。
C++入门基础
1.命名空间
1.1 概念和作用
在C语言中同一个作用域不能出现同名变量和函数,但在C++中可以因为C++提出了命名空间的概念,命名空间是一个单独的作用域。命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。用语言描述描述这些东西太过于晦涩直接上代码!
命名空间的格式很简单只需要一个关键字namespace + 空间的名字 + {} 。那么如何访问命名空间中的内容呢?在获取命名空间中的变量时只需空间的名字加上"::"就可以访问命名空间的中的内容。
namespace zh
{//这一是叫zh的命名空间int i = 2;void fun(){printf("这是zh\n");}
}
namespace hh
{//这是叫hh的命名空间void fun(){printf("这是hh\n");}int i = 1;
}
int mian()
{zh::fun();hh::fun();printf("%d\n", zh::i);printf("%d\n", hh::i);return 0;
}

1.2 using关键字
通过using关键字可以引入命名空间中的变量,或是直接将命名空间引入。
namespace zl
{int c = 0;
}
using namespace hh;
using zl::c;
int main()
{printf("%d\n", c);fun();return 0;
}

2.C++的输入和输出
在C语言中的输入和输出是借助printf和scanf进行操作的,但是在C++中不使用这两函数进行输入和输出而是使用cout和cin这两个对象需要包含头文件<iostream>,在C++在包含头文件时不需要在头文件后面加.h。这里也需要大家了解到是这使用cout和cin时我们需要引用std这个命名空间这是C++标准库,C++将标准库的定义和实现都放在这个名空间内。在日常的代码练习中建议直接展开这个命名空间,这样可以方便书写不展开的话如果想使用cout就需要在cout前面加上命名空间即std::cout。(这里只是简单的使用方法不涉及底层)
cout是标准输出流对象(控制台),cin是标准输入流对象(键盘),cout和cin的优势在于自动识别数据的类型。下面这两组代码的作用都是一样的你更愿意写哪种?
int main()
{int a = 9;//1printf("%d", a);scanf("%d", &a);//2cout << a;cin >> a;return 0;
}
3.缺省参数
3.1 概念
缺省参数我愿称其为备胎,缺省参数的作用是在定义或者声明时可以给函数的参数一个缺省值,当调用函数时不进行传参这时在编译器就会将缺省值当做默认的参数进行传参。注意在声明和定义式不能同时给缺省值。
//void func(int i = 10);
void func(int i = 10)
{cout << i << endl;
}
int main()
{func();func(1);return 0;
}
如果放开注释就会报错

3.2 全缺省
全缺省的意思就是函数声明或者定义时所有的参数都给缺省值
void func1(int a = 1, int b = 2, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
int main()
{func1();func1(8, 9, 10);return 0;
}
3.3 半缺省
半缺省顾名思义就是给一半的缺省参数但是需要注意的是一半的缺省参数需要从右往左给。因为只有一部分的参数有缺省参数,另一部分没有缺省参数所以在传参的时候是从左往右传参的。
void func1(int a = 1, int b = 2, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
void func2(int a, int b, int c = 100, int d = 900)
{cout << a << " " << b << " " << c <<" "<< d << endl;
}
int main()
{func2(1, 2);func2(100, 200);return 0;
}

4.函数重载
如何构成函数的重载,当函数名相同形参的类型以及个数或者类型顺序不同时就可以构成函数的重载。直接上代码
//参数类型不同
int add(int a, int b)
{cout << "add(int a, int b)" << endl;return a + b;
}
double add(double a, double b)
{cout << "add(double a, double b)" << endl;return a + b;
}
//参数个数不同
int add(int a)
{cout << "add(int a)" << endl;return a;
}
//参数的顺序不同
void print(int a, char b)
{cout <<"print(int a, char b)"<< endl;
}
void print(char b, int a)
{cout <<"char b, int a"<< endl;
}
int main()
{add(1, 2);add(1.0, 2.0);add(100);print(1, 'c');print('c', 1);
}

为什么C++支持函数重载呢?
因为在C++中在进行编译的时候C++会对函数名进行修饰通过参数的不同或者返回值的不同对函数名进行修饰给函数名添加特殊符号等,使得链接时每个函数名都对应着不同的函数。
但是C语言没有函数名修饰的机制,函数进行编译后就直接添加到符号表中,所以无法区分同名的不同函数。
5.引用
5.1 概念
引用是对一个已经初始化过的变量重新起一个别名,这个别名指向那个变量所在的位置,编译器不会为引用开辟空间,引用和被引用的变量共用一块空间。
int main()
{int a = 0;int& b = a;cout << a << endl;cout << b << endl;return 0;
}

5.2 引用的特殊性质
1.引用定义时必须初始化。2.一个变量可以有多个引用。3.引用一个元素后就不能引用其他元素。

int main()
{int a = 0;int& b = a;int& i = a;int c = 9;b = c;//这段代码并不会改变b的引用而是将c的值付给b,又因为b是a的应用所以改变的是a的值cout <<"b = "<< b << " "<<"i = " << i << " " << "a = " << a << endl;return 0;
}

5.3 常引用
顾名思义常引用就是对常量进行引用,但是C++中规定不能对一个常量直接进行引用,常量即为不能被修改的量。这里就需要就需要引入新的知识点,权限的放大和缩小。
权限的放大:对于一个被const修饰的对象,是不能被绑定到一个非const的引用上,当一个非const的引用绑定到const修饰的对象上时,因为被const修饰的对象是不能被修改,但是非const修饰的引用是可以随意修改的,这就导致了权限的放大(不能修改->可以随意修改),这就导致了两个概念相悖。
权限的缩小:对于一个常量对象,是可以被绑定到一个const修饰的引用上的,因为常量对象不能被修改,const修饰的引用也不能被修改,原本的引用是可以随意的修改但是加上了const修饰就将其的权限进行了缩小,在C++中权限可以被缩小但是不能被放大。

int main()
{//将一个const修饰的对象进行权限的缩小const int a = 9;const int& c = a;//将一个变量的引用用const修饰,引用本身是可以随意修改的但是加上了const就不能修改了也是权限的缩小int b = 7;const int& z = b;b = 2;//但是b变量本身是可以修改的因为b没有被const修饰return 0;
}
5.4引用的使用
C语言和C++是极度追求效率的语言,引用就能极大的提升效率。为什么说引用可以提升效率呢?下面举两个例子:1.引用做函数的参数 2.引用做函数的返回值
1.引用做为函数的参数
int Add1(int& a1, int& b1)
{return a + b;
}
int Add2(int a2, int b2)
{return a + b;
}
int main()
{int a = 9;int b = 8;Add1(a, b);Add2(a, b);return 0;
}
上面这两段代码功能都是一样,但效率上不同。引用作为函数的参数也是就说a1是a的一个别名也就说a1是没有开辟空间的,但Add2中a2在调用的时候是需要开辟一个临时新的空间用于存储形参这个过程是需要时间的。因为计算机的计算速度非常的快,所以这两个函数调用时效率上没有区别但是如果当在调用的时候进行大量的传参呢?比如对一亿个数据进行排序呢?这样差距就体现出来了。所以在C++中经常用到引用做参数。
2.引用做函数的返回值
int& Add(int a, int b)
{int c = a + b;return c;
}
const int& Add1(int a,int b)
{return a + b;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :" << ret << endl;return 0;
}
注:函数的返回值不是直接进行返回而是先创建一个临时变量,将临时变量的值赋给接收函数返回值的变量。临时变量是具有常性的Add1函数中返回值是cosnt类型引用的返回值,为什么要加const是因为Add1返回的是一个临时的变量具有常性所用要用const进行修饰缩小权限。
所以上述代码的结果是什么?
上述代码的结果是随机值。因为:Add函数是引用做返回值,所以返回的是一个临时的变量这个临时变量,用了一个ret引用接收ret和这个临时变量共用一个空间。这函数的栈帧结束之后这个临时变量就销毁了,临时变量销毁了所以ret就没有指向的内容了,即便在调用了一次Add因为没有用ret接收所以,这段代码运行的结果是随机值。

5.5 引用和指针的区别
指针和引用的区别是一道经典的C++面试题。
1.从内存的角度来说指针在创建的时候是需要创建空间存储地址的,但引用不需要引用就是给原本的空间起一个别名。
2.指针可以不进行初始化,但是引用必须进行初始化。
3.有多级指针但是没有多级引用。
4.指针可以随意改变指向,但是引用不可以。
5.在sizeof中含义不同,引用返回的是引用类型的大小,而指针在32位下(4个字节)和64位下(8个字节)返回值不同。
6.引用加1即被引用的对象进行加1,指针加一是指针向后偏移一个类型的长度。
7.访问实体的方式不一样,引用编译器自动处理,指针需要解引用。
8.指针会出现野指针和为空的情况,而引用不会所以引用更加安全。
6.内联函数
6.1概念
被inline修饰的函数被称为内联函数,内联函数也是用来提高效率的。内联函数会被调用的地方进行展开,展开的目的就是不创建函数的栈帧提高运行效率。
6.2特性
1.内联是一种以空间换时间的做法,在调用的地方直接将函数展开会使目标文件会变大。
2.内联只是对编译器的一种建议,编译器可以选择不采用。假设你将一个要递归多次的函数定义为内联函数那么编译器是不会对其进行展开的。
3.内联函数不能进行函数的定义和分离,因为内联函数在编译阶段是直接被展开的,如果定义和申明分离就会导致找不到函数的地址就会导致无法连接错误。
为了实现内联展开,编译器需要在编译时看到函数的完整定义。如果内联函数的定义和声明分离,编译器在看到声明时无法进行内联展开,因为它没有函数体的具体实现。
如果内联函数的定义和声明分离,并且定义仅在一个翻译单元中可见,那么其他翻译单元在链接时将无法找到该函数的实现,导致链接错误。
7.auto关键字
7.1概念
auto关键字是自动推导类型。当定义类型比较难拼写时可以实用auto(vector的迭代器)。
int main()
{auto a = 8;//这时auto就是整形auto b = 8.9;//这是auto就是double类型//这里打印一下a b 的类型cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;return 0;
}

7.2 特性
1.auto定义的时候必须初始化,因为如果不进行初始化编译器就无法推导auto定义的变量类型。

2. auto和auto*没有什么区别,但是auto引用必须加&
因为auto是可以自动推导类型的如果初始化变量的是一个地址那么auto就会初始化为个一指针类型,但引用不能省略&因为auto无法推导。
int main()
{int a = 0;auto b = &a;auto* c = &a;auto& v = a;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(v).name() << endl;return 0;
}

3.使用auto时不能进行一行有多个变量进行定义

4.auto不能用来定义函数的参数
void dunc(auto a)//因为这使用auto在编译时无法推导出变量的类型
{cout << "dunc" << endl;
}
5.auto不能用来定义数组(C++的规定)

8.范围for的使用和语法
如果想要遍历一个数组应该怎么写?
int main()
{//常规写法int a[] = { 1,2,4,5,6,7,8 };for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++){cout << a[i] << " ";}cout << endl;//范围for写法for (auto e : a){cout << e << " ";}return 0;
}

9.空指针nullptr
NULL是如何被定义的在C++98中NULL是一个宏被定义为(void*)指针或者0,所以这使用NULL指针时我们就会遇到麻烦。所以C++就引入了nullptr用来解决NULL的问题,相比于NULL来说nullptr更加安全。
void f(int)
{
cout<<"f(int)"<<endl;
}
void f(int*)
{
cout<<"f(int*)"<<endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}

总结
综上所述就是C++的一些入门知识点的讲解,这些知识点比较细碎不好理解但是这些知识点都是非常有用的在,某些特殊的场景下你会惊叹这样的语法设置非常巧妙。打个比方auto虽然看着确实方便但是好像也就一点点方便,举个栗子如果在STL容器中用来定义一些vector List这些容器的迭代器时你就感觉,auto太妙了。总之这些知识点之所以细碎是因为没有放到适合的场景下去体会,后面的博客我会带大家去好好体会其的妙用。
希望大佬们多多指点!也希望大家多多点赞、收藏、关注!
相关文章:
C++入门基础篇
引言 说到编程语言常常听到的就是C语言C Java 。C语言是面向过程的,C是和Java是面向对象的,那么什么是面向对象呢?什么又是面向过程呢?C是什么?封装、继承、多态是什么?且听我絮絮叨叨。 C入门基础 1.命名…...
Qt QListWidget 代码范例,以及Qt 天坑:setStyleSheet失效问题
一、坑之所在 1.写了StyleSheet的QString并进行了设置 this->setStyleSheet(styleSheet_M);2.注释后,将StyleSheet换到UI form里去,然后又手动清理了UI form里的StyleSheet 重新使用代码设置,此时代码设置失效了 二、根本解决 1.手动从…...
Unity AnimationClip详解(1)
【动画片段】 前文我们介绍了骨骼动画,在Unity中骨骼动画的部分静态数据存储在SkinedMeshRender中,而另一部分动态的关键帧数据就是存储在AnimationClip中的。 关键帧数据来自与FBX、OBJ等动画模型文件,可以在动画导入后的Animation选项卡中…...
在这12种场景下会使Spring事务失效--注意防范
在某些业务场景下,如果一个请求中,需要同事写入多张表的数据,但为了保证操作的原子性(要么同事插入数据成功,要么同事插入失败),例如,当我们创建用户的时候,往往会给用户…...
SOPC:Nios II Processor -> Vectors
Reset Vector——复位向量 Exception Vector——执行向量 两个向量地址都存储着程序 1.Reset Vector 当FPGA进行复位时,FPGA就重新开始执行程序,这时就需要从EPCS中读取程序。由于FPGA的程序存放在EPC…...
golang学习笔记11——Go 语言的并发与同步实现详解
推荐学习文档 基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学习笔记04——如何真正写好Golang代码&…...
关于汽车加油是加200还是加满的思考
车子快开了1万公里了,每个月保险会送一个200-15的加油优惠券,所以之前一直是每次加200的习惯, 最近突然觉得经常去加油很麻烦,而且很浪费时间, 需要重新评估一下, 一次加200 or 一次加300 or 一次加满&am…...
C# 去掉字符串最后一个字符的5种方法
C# 去掉字符串最后一个字符的 5 种方法 (1)Substring string original "Hello!"; string result original.Substring(0, original.Length - 1); Console.WriteLine(result); // 输出: Hello (2)Remove string o…...
[Redis] Redis中的String类型
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
Transiting from CUDA to HIP(三)
一、Workarounds 1. memcpyToSymbol 在 HIP (Heterogeneous-compute Interface for Portability) 中,hipMemcpyToSymbol 函数用于将数据从主机内存复制到设备上的全局内存或常量内存中,这样可以在设备端的内核中访问这些数据。这个功能特别有用&#x…...
基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统
系统展示 用户界面 管理员界面 系统背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度…...
游戏的3C,Al
在游戏开发中,“3C”通常指的是三个重要的组成部分:Character(角色)、Camera(摄像机)和Control(控制)。这三者对于创建沉浸式和流畅的游戏体验至关重要。而AI(人工智能&a…...
深度学习基础案例4--运用动态学习率构建CNN卷积神经网络实现的运动鞋识别(测试集的准确率84%)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 前几天一直很忙,一直在数学建模中,没有来得及更新,接下来将恢复正常这一次的案例很有意思:在学习动态调整…...
tekton pipeline workspaces
tekton pipeline workspace是一种为执行中的管道及其任务提供可用的共享卷的方法。 在pipeline中定义worksapce作为共享卷传递给相关的task。在tekton中定义workspace的用途有以下几点: 存储输入和/或输出在task之间共享数据secret认证的挂载点ConfigMap中保存的配置的挂载点…...
[git操作] git创建仓库上传github报错
操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错: fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …...
飞牛fnOS安装KDE桌面
飞牛fnOS安装KDE桌面 这段时间新出的nas系统飞牛os真不错,基于debian的可折腾性又高了不少,今天就来给这个系统装个桌面,插上显示器也能当个电脑自己进自己的管理界面,播放下视频,上上网啥的。 文章目录 飞牛fnOS安装…...
运维Tips | 如何安全的移除系统中旧的Linux内核?
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 如何安全的删除系统中旧的 Linux 内核? 描述:如果更新了 Linux 操作系统,那么你会注意到,每次升级 Linux 内核后,GRUB 菜单都会添加一个新的引导条…...
基于JAVA+SpringBoot+Vue的工程教育认证的计算机课程管理平台
基于JAVASpringBootVue的工程教育认证的计算机课程管理平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接…...
软件质量保障:故障演练介绍
目录 背景:架构变化带来的问题 什么是故障演练 为什么需要故障演练 故障演练场景有哪些 不同演练类型和目标 如何对工具进行评估 功能评测项 告警评测项 观测指标评测项 总结 背景:架构变化带来的问题 随着架构越来越复杂、应用越来越多样&…...
Vue3可编辑表格插件
插件亮点: 通过可自定义单元格内容。可控的状态控制,例如只读、禁止编辑行等配置。可控的状态交互,例如框选单元格、框选行等配置。可控的推拽顺序,例如拖拽行、推拽列。方便的单元格数据验证配置。方便的快捷右键菜单,…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
