C++命运石之门代码抉择:C++入门(上)

文章目录

  • 1.前言
    • 1.1 什么是C++
    • 1.2 C++的发展
    • 1.3 C++的重要性
    • 1.4 如何学习C++
    • 1.5 C++要学什么
  • 2. C语言过渡到C++(上)
    • 2.1 域
      • 2.1.1 命名空间
        • 2.1.1.1 定义
        • 2.1.1.2 作用域限定符
        • 2.1.1.3 使用
      • 2.1.2 域的使用优先级
    • 2.2 输入及输出
      • 2.2.1 std 命名空间及自定义命名空间
      • 2.2.2 .C++输入&输出
    • 2.3 缺省参数
      • 2.3.1 全缺省
      • 2.3.2 半缺省
      • 2.3.3 函数声明和定义中的缺省参数
  • 希望读者们多多三连支持
  • 小编会继续更新
  • 你们的鼓励就是我前进的动力!

走过了C语言的道路,终于迎来了C++的学习之旅,在经历面向过程的不断打磨,相信大家积累了不少的代码基础了,即将到来的是面向对象的语言——C++,C++的知识点稍显杂碎,或许在初步的学习会感觉到举步艰难,但是阳光总在风雨后,打好基础学到 stl 库的时候就会发现别样的彩虹!🌈😻

1.前言

1.1 什么是C++

请添加图片描述

C++ 是一种高级编程语言,它在 C 语言的基础上发展而来的面向对象的语言,C++ 最初是由丹麦计算机科学家本贾尼・斯特劳斯特卢普(Bjarne Stroustrup)在 20 世纪 80 年代初期开发的,当时,C 语言已经在系统编程等领域广泛应用,但对于大型软件项目的开发,缺乏一些如代码复用、数据抽象等方便的机制,简单来说就是对一些自定义类型的完善,C++ 应运而生,它增加了类和对象等面向对象的概念,使得程序可以更好地组织和维护

1.2 C++的发展

语言的开发都是在原先基础上增加新的语法规则,而不是删掉过去的语法规则,不然会导致以前编程环境下的代码都无法运行(python除外),于是在C语言的基础上进行扩展,增加了类的机制,称之为C with classes

在这里插入图片描述

刚开始是每五年更新一次语法规则,但随着生产力的需要,加快了语法规则的更新,变为三年

现在主流使用还是C++98和C++11,所有不用追求最新
重点将C++98和C++11掌握好,随着对C++理解不断加深,有时间可以去琢磨下更新的特性

1.3 C++的重要性

图片计算机语言排名来自TIOBE编程语言社区
2024年7月最新的排行榜

在这里插入图片描述

近几年 C++ 的上涨趋势还是比较明显的,虽然说还比不上 python 泛用性强大,但是 C++作为常年排名前几的语言,学习起来还是特别有价值的

在这里插入图片描述
就拿现在发展较🔥的人工智能来说,大家首先想到的就是 python ,认为学习人工智能就要学习python,这个是误区,python 中库比较丰富,使用 python 可以快速搭建神经网络、填入参数导入数据就可以开始训练模型了,但人工智能背后深度学习算法等核心还是用 C++ 写的

1.4 如何学习C++

在这里插入图片描述
首先不要把 C++ 学会当成一个短期目标,而是一个长期目标,要精通这门语言还是需要花费很久的时间的

🚩1. 写博客总结
🚩2. 画思维导图整理思路
🚩3. 深入C++后,借鉴大佬的书刊或文章
🚩4. 多刷题!多刷题!多刷题!重要的事情说三遍

1.5 C++要学什么

C++ 的重点可以大致分为封装、多态、继承

其中重点学习:

🔥C++的基本语法
🔥STL库
🔥高阶的数据结构

2. C语言过渡到C++(上)

那么接下来正式开始C++内容的学习,但在学习前要先介绍一些知识点便于过渡到 C++ 的重点内容——类与对象

2.1 域

域可以理解为一个围栏,把这些代码给围起来,分为全局域、局部域、类域、命名空间域
这里重点介绍一下命名空间

2.1.1 命名空间

C语言中经常会出现命名冲突的现象,变量或函数的名字不能相同,但是在处理项目的时候,不可能互相去确认各自的文件中有没有出现命名冲突的现象,所以引入了命名空间域的概念

2.1.1.1 定义

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的

using namespace std
//表示打开标准库命名空间 std

每个命名空间都是封锁的,只有打开了才能使用里面的变量及函数,这解释为什么域可以防止命名冲突的原因

定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对{ }即可,{ }中即为命名空间的成员

namespace bit
{
 // 命名空间中可以定义变量/函数/类型
 int rand = 10;
 
 int Add(int left, int right)
 {
 return left + right;
 }

 struct Node
 {
 struct Node* next;
 int val;
 };
}

值得注意的是:在 { } 后和结构体不一样,不用加;

2.1.1.2 作用域限定符

:: 是作用域解析运算符,它用于明确指定变量、函数或类型所属的作用域。这个作用域可以是全局作用域、类作用域(后面介绍)或者命名空间作用域

🚩访问全局域

int a = 0;

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

这里打印出来是 0 和 1,作用域解析运算符前面是空的就表示访问全局域的 a

🚩访问命名空间域

namespace N
{
	int a = 0;
}

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

这里打印出来是 0 和 1 ,作用域解析运算符前面是命名空间的名字就表示访问命名空间域的 a

2.1.1.3 使用

🚩命名空间的嵌套

namespace N1
{
int a = 0;
int b;
int Add(int left, int right)
 {
     return left + right;
 }
namespace N2
 {
     int a = 1;
     int c;
     int d;
     int Sub(int left, int right)
     {
         return left - right;
     }
 }
}

这里命名空间 N1 里又嵌套了一个命名空间 N2,这两个命名空间也可以定义同名变量

printf("%d\n",N1::N2::a);
//访问 N2 的 a
printf("%d\n",N1::a);
//访问 N1 的 a

🚩命名空间的合并
同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
一个工程中的 test.h 和 test.cpp 中两个 N1 会被合并成一个

//test.h
namespace N1
{
	int a = 0;
}
//test.cpp
namespace N1
{
	int b = 1;
}

这两个命名空间会合并,直接把它们两个当成同一个空间使用就行了

2.1.2 域的使用优先级

优先级:局部域 → 全局域 → 命名空间域

🚩局部域和全局域

int a = 0;

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

这里输出 2 ,局部域优先

🚩命名空间域

//int a = 0;

namesapce N
{
	int a = 1;
}

using namespace N;

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

这里输出 1 ,只有在打开命名空间域 or 指定访问命名空间域

才能访问里面的 a ,打开命名空间域相当于把里面的 a 暴露在全局域里了,所以此时 int a = 0 仍然存在的话会造成命名冲突

2.2 输入及输出

2.2.1 std 命名空间及自定义命名空间

在这里插入图片描述
一般 C++ 编译器都自带了一些命名空间,这些命名空间里都存放了一些供我们使用的函数,比如 std 命名空间里有 STL 库和 C++ 标准库

但这些不足以满足项目开发使用,所以还有些程序员自定义的命名空间

🔥值得注意的是:在项目开发的时候,直接展开命名空间会有风险,我们的定义如果跟库重名就报错了,所以一般用作用域限定符访问自己想用的,但是在学习语法的时候我们一般不会出现这种问题,为了方便使用直接展开就好了

2.2.2 .C++输入&输出

在老版本编译器,如:VC6.0,没有命名空间的概念,引用库头文件还是包含 .h 的,但是随着命名空间的引入,为了和 C 语言区分,引用库头文件写成 #include < iostream >,就是把 .h 去掉了,该头文件包含了输入输出

eg

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
    cin >> a;
	cout << "Hello world!!!" << endl;
	cout << a << endl;
	// endl 为换行符,相当于 \n ,但 \n 在字符串中使用
	return 0;
}

🚩1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std

🚩2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中

🚩3. <<是流插入运算符,>>是流提取运算符

🚩4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式,C++的输入输出可以自动识别变量类型

2.3 缺省参数

缺省参数是指在函数声明或定义时为参数指定一个默认值。当调用函数时,如果没有为这个带有缺省参数的参数提供实际的值,函数就会使用默认值

2.3.1 全缺省

void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

int main()
{
	Func1();
	Func2(1,2,3);
	return 0;
}

Func1 为10、20、30,Func2 为1、2、3

• 没有传参时,如果函数在传参的时候无法确定要传的参数的值时,可以使用参数的默认值暂时代替

• 传参时,使用指定的实参

2.3.2 半缺省

void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

int main()
{
	Func1(1);
	Func2(1,2);
	Func3(1,2,3);
	return 0;
}

Func1 为1、20、30;Func2 为1、2、30;Func3 为1、2、3

🔥值得注意的是:传参必须从左往右传;缺省参数必须从右向左依次设置,也就是说,一个参数如果有缺省值,那么它右边的所有参数都必须有缺省值

2.3.3 函数声明和定义中的缺省参数

//test.h
  void Func(int a = 10);
  
//test.cpp
  void Func(int a = 20)
 {}
  
  // 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值

所以一般把缺省值放在声明,这样在编译过程中能让程序知道有个默认值能够初始化,在链接阶段才会知道有个能够使用的默认值。放在定义的时候编译阶段就会报错

🔥值得注意的是:缺省值必须是常量或者全局变量,且C语言不支持(编译器不支持)

希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Composer在安装的过程中经常找不到刚更新的包

明明有v2.1.0版本&#xff0c;安装就是找不到这个版本的包。 1. Composer 官方网址&#xff1a;https://getcomposer.org 中文网站&#xff1a;https://www.phpcomposer.com 官方文档&#xff1a;https://docs.phpcomposer.com 2. Packagist Packagist 是 Composer的组件仓库…

Android笔记【14】结合LaunchedEffect实现计时器功能。

一、问题 cy老师第五次作业 结合LaunchedEffect实现计时器功能。要求&#xff1a;动态计时&#xff0c;每秒修改时间&#xff0c;计时的时间格式为“00&#xff1a;00&#xff1a;00”&#xff08;小时&#xff1a;分钟&#xff1a;秒&#xff09;提交源代码的文本和运行截图…

【强化学习入门笔记】 2.1 值迭代

本系列为学习赵世钰老师的《强化学习的数学原理》所作的学习笔记. 本节我们将介绍强化学习中的值迭代求解方法. 2.1.1 算法步骤 在1.5节我们介绍了通过迭代可以求贝尔曼最优公式的最优解, 这个方法就叫值迭代: v k 1 max ⁡ π ∈ Π ( r π γ P π v k ) , k 0 , 1 , …

汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集

本数据集支持YOLO&#xff0c;COCO&#xff0c;VOC三种格式标记汽车车牌&#xff0c;无论是新能源汽车还是油车都能识别标记&#xff0c;该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70&#xff05; 2800图片 有效集 20&#xff05; 800图片 测…

python基础:(八)文件

目录 一.从文件中读取数据1.1读取整个文件1.2文件路劲1.3逐行读取 二.写入文件 一.从文件中读取数据 各位小伙伴&#xff0c;文件这一块得好好学&#xff0c;多看多敲代码&#xff0c;以后处理数据&#xff0c;写爬虫少不了这个&#xff0c;先从基础&#xff08;简单的&#x…

输电线路故障测距研究

故障分析法容易受到过渡电阻、故障类型等因素的影响&#xff0c;从而造成测距误差较大。 行波法不受电力系统运行方式的影响&#xff0c;得到了广泛的应用。波头信息的提取方法主要有&#xff1a;小波变换、希尔伯特黄变换、TT变换等。 智能测距法逐渐被应用于输电线路故障测…

FPGA实战篇(IP核之MMCM/PLL实验)

1.MMCM/PLL IP 核简介 锁相环作为一种反馈控制电路&#xff0c;其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪&#xff0c;所以锁相环通常用于闭环跟踪电路。 锁相环在工作的过程中&#xff0c;当…

wordpress网站安装了Linux宝塔面板,限制IP地址访问网站,只能使用域名访问网站

一、Linux服务器安装Linux宝塔面板 这个步骤参考网上其他教程。 二、Linux宝塔面板部署wordpress网站 这个步骤参考网上其他教程&#xff0c;保证网站能够正常访问&#xff0c;并且使用Linux宝塔面板申请并部署了SSL证书&#xff0c;使用https协议默认443端口正常访问。 三…

顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍

大语言模型一般都是流式返回文字&#xff0c;如果等全部文字返回了一次性去TTS&#xff0c;那么延迟会非常严重&#xff0c;常用的方法就是通过标点符号断句&#xff0c;返回了一句话就提交给TTS。随着流TTS的出现&#xff0c;就可以直接把大模型返回的文字灌给流TTS&#xff0…

leetcode每日一题(20241210)

leetcode每日一题&#xff08;20241210&#xff09;今天依旧是棋盘类型的题目&#xff0c;但是今天的只是表面相关&#xff0c;看题&#xff1a; 935.骑士拨号器 题目描述&#xff1a; 象棋骑士有一个独特的移动方式&#xff0c;它可以垂直移动两个方格&#xff0c;水平移动一…

记录ubuntu22.04重启以后无法获取IP地址的问题处理方案

现象描述&#xff1a;我的虚拟机网络设置为桥接模式&#xff0c;输入ifconfig只显示127.0.0.1&#xff0c;不能连上外网。&#xff0c;且无法上网&#xff0c;用ifconfig只有如下显示&#xff1a; 1、sudo -i切换为root用户 2、输入dhclient -v 再输入ifconfig就可以看到多了…

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…

strncpy在复制含有多个\0的字符串时遇到的问题

strncpy在复制含有多个\0的字符串的时候&#xff0c;会产生截断&#xff0c;因为strncpy在读取源字符串的时候&#xff0c;遇到了\0&#xff0c;函数会认为该字符串已经结束了&#xff0c;然后会向目标字符串内填充\0。 char buffer[100] "ak\0jl";for (int i 0; i…

C# 网络编程--基础核心内容

在现今软件开发中&#xff0c;网络编程是非常重要的一部分&#xff0c;本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌&#xff1a; : 上图引用大佬的图&#xff0c;大家也关注一下&#xff0c;有技术有品质&#xff0c;有国有家&#xff0c;情…

驱动---1.DAC8552实现三角波输出

最近开始进行新项目的研发&#xff0c;考虑用DAC做一个前级输出&#xff0c;选择了DAC8552这个器件的一个模块&#xff0c;用了野火的指南者做主控&#xff0c;芯片是STM32F103VET6&#xff0c;主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…

Elasticsearch入门之HTTP基础操作

RESTful REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是&#xff0c;客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在…

计算机启动过程 | Linux 启动流程

注&#xff1a;本文为“计算机启动、 Linux 启动”相关文章合辑。 替换引文部分不清晰的图。 探索计算机的启动过程 Aleksandr Goncharov 2023/04/21 很多人对计算机的启动方式很感兴趣。只要设备开启&#xff0c;这就是魔法开始和持续的地方。在本文中&#xff0c;我们将概…

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据&#xff0c;原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月栅格数据我们采用求年平均值的方法得到逐年最…

Hash、HASHTABLE底层原理【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…

YOLOv11改进,YOLOv11添加GSConv卷积+Slim-neck,助力小目标检测,二次创新C3k2结构

实时目标检测在工业和研究领域中具有重要意义。在边缘设备上,巨大的模型难以满足实时检测的要求,而由大量深度可分离卷积(depth-wise separable convolution)构建的轻量级模型又无法达到足够的精度。作者引入了一种新的轻量级卷积技术——GSConv,以减轻模型重量同时保持精…