【C++初阶】第1课—初识c++

news2024/11/18 1:11:24

文章目录

  • 1. 学习c++之前的开胃菜
  • 2. c++的发展历程
  • 3. c++参考文档
  • 4. c++的第一个程序
  • 5. 命名空间
    • 5.1 关键字namespace
    • 5.2 namespace的嵌套使用
    • 5.3 命名空间的使用
  • 6. c++输入和输出
  • 7. 缺省参数
  • 8. 函数重载
  • 9. 引用
    • 9.1 引用的使用
    • 9.2 const引用
    • 9.3 引用和指针的关系
  • 10. nullptr
  • 11. inline修饰内联函数
  • 12. 补充知识点(编译和链接)

1. 学习c++之前的开胃菜

  估计大家刚开始学习c++之前,都觉得这门语言忒难,可是为什么大家还是毅然决然的选择了他呢?反过来讲,既然选择了计算机这条路,那么有哪条路又是好走的,如果你感觉现在学的很吃力,那么恭喜你,说明你正在走上坡路,无数个日夜,你努力啃着晦涩难懂的代码,终究有一天,你会将他们全部弄懂,就像翁凯老师讲的“计算机里没有黑魔法,它也是人为创造出来的,只是以我们当前的学识还不能理解,但终有一天我们会全部搞懂那些曾经自以为晦涩难懂的代码

觉得计算机难学的集合了

  好了,接下来进入我们今天的主题,就由我来为大家打开c++的大门

2. c++的发展历程

  c++最初是由Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)1983年在贝尔实验室设计出了它,在1997年11月14日,联合标准化委员会通过了它的最终草案,并在1998年c++投入使用
  另外c语言也是从贝尔实验室出来的,下面的两张图片就是c++的创始人
| 在这里插入图片描述
| 在这里插入图片描述

3. c++参考文档

  • c++非官网文档
  • c++官网文档—中文
  • c++官网文档—英文

4. c++的第一个程序

  • c++中需要将文件后缀定义为.cpp
  • 当然,c++也兼容了c的语法,c之前的输入输出也能在cpp文件中运行
  • c++也有自己的一套输入输出语法

在这里插入图片描述

在这里插入图片描述
  这里不懂也没关系,接下来我们一一讲解

5. 命名空间

5.1 关键字namespace

  • 在c/c++中,变量、函数和c++中的类都是大量存在的,这些变量和函数、类的名字可能会出现重复的风险,最终会导致编译器报错。而c++就引入了命名空间,关键字是namespace
  • 使用命名空间后,可以对标识符的名字进行封装,避免重名的冲突
  • c++标准库都放在一个叫std(standard)的命名空间中,因此我们经常看见using namespace std;这里的using是展开c++标准库的意思,后面会讲到

在这里插入图片描述
在这里插入图片描述

  • 从这里可以看出,namespace对变量、函数等进行封装后,就可以避免命名冲突的问题
  • namespace后面+命名空间的名字,大括号里面的都是命名空间的成员
  • namespace本质上是定义了一个域,之前我们学过全局域和函数局部域,而namespace定义的这个域跟全部域各自独立,全局域和局部域是有生命周期的
  • c++中有函数局部域、全局域、命名空间域、类域,而类域和命名空间域是不影响变量的生命周期的
  • 另外再补充一点,上述图片中c++的namespace定义的命名空间成员rand其实就是一个全局变量,只不过namespace给它封装起来而已

5.2 namespace的嵌套使用

  • namespace只能定义在全局,当然它也可以嵌套使用
  • ::是namespae的访问操作符号

在这里插入图片描述

  • namespace定义结构体成员

在这里插入图片描述

  • 项目工程中多个文件定义的namespace重名时,编译器会认为那是同一个namespace,不会冲突

在这里插入图片描述


5.3 命名空间的使用

  • 编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找
  • 因此访问命名空间内的成员时,一般采用指定的访问操作符::
  • using可以将命名空间内的某个成员展开,在项目中经常访问的不存在冲突的成员推荐这种⽅式
  • 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常练习程序为了方便推荐使用

在这里插入图片描述


  • using展开命名空间成员后,则不用每次都输入访问符::来访问其内的成员了,但一般只在练习中使用

6. c++输入和输出

  • <iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象
  • std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入流
  • std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流
  • std::endl 是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区
  • <<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入、输出可以自动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出
  • IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这个以后我们会讲到
  • cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间去使用他们
  • 一般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std
  • vs编译器不包含<stdio.h>头文件也可以使用scanf/printf函数,这是因为<iostream.h>头文件间接包含了,但其他编译器可能未包含
  • 还有一点需要注意的是,c++添加了命名空间后,对于头文件的包含,可以省去.h,也就是<iostream.h>可以写成<iostream>的形式

  刚接触到这么多新的知识,看起来是不是有点懵,接下来我将通过图解示范帮助大家快速入门


在这里插入图片描述


在这里插入图片描述


  • 从以上例子可以看出,c++在采用输入输出流后,再也不需要限定输入输出变量的格式,因为编译器会自动识别变量类型

7. 缺省参数

  • 缺省参数就是在声明或者定义函数时为函数的参数指定一个缺省值,在调用该函数时,如果没有指定该参数的值,默认采用该缺省值,否则使用指定的实参,有时也将缺省参数叫做默认参数
  • 函数定义和函数声明分离时,两者只需其一含缺省参数即可,不可两者都含缺省参数,因为这样编译器也不知道要采用谁的缺省值,会报错

在这里插入图片描述


在这里插入图片描述


  • 缺省参数也分为全缺省参数和半缺省参数,其中全缺省参数就是函数的形参全部给定缺省值,而半缺省参数就是部分形参给定缺省值
  • c++规定半缺省参数必须从右到左依次连续缺省,不能间隔跳跃给定缺省值
  • c++规定带缺省参数的函数调用,必须从左到右依次给实参,不能跳跃给实参

在这里插入图片描述


8. 函数重载

  • C++支持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的
  • 构成函数重载:函数名相同,参数类型或参数个数不同

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


9. 引用

  • 引用不是新定义了一个变量,而是给变量起了一个别名,编译器也不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
  • 引用的格式:<code>类型& 引用别名 = 引用对象</code>
  • 引用在使用之前必须初始化
  • 引用只能引用一个实体,再不能引用其他实体

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


9.1 引用的使用

  • 引用主要用于引用传参和引用做返回值,用于减少拷贝,来提高程序运行的效率,同时在改变引用对象的同时,还可以改变被引用对象

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


  • 引用传参和指针传参类似,不过引用传参更为方便
  • 引用返回值的场景较为复杂,这里只作为简单介绍,后续补充
  • 引用和指针相辅相成,两者有许多重叠的地方,重叠的地方在c++里面一般都用引用,而像数据结构中的链表、二叉树等,还是用指针,因为引用不能改变指向,指针可以

在这里插入图片描述


在这里插入图片描述


9.2 const引用

  • const引用对象时,权限不能放大,只能平移或者缩小权限

在这里插入图片描述


在这里插入图片描述


  • 不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场景下a*3的和结果保存在⼀个临时对象中, int& rd = d也是类似,在类型转换中会产生临时对象存储中间值,也就是时,rb和rd引用的都是临时对象,而C++规定临时对象具有常性,所以这里就触发了权限放大,必须要用常引用才可以
  • 所谓的临时对象,就是编译器需要一个空间暂存表达式的求值结果时,临时创建的一个未命名的对象,c++把这个未命名对象称为临时对象

在这里插入图片描述


9.3 引用和指针的关系

  • c++中指针和引用就像是亲兄弟,指针是哥哥,引用是弟弟,实践中它们相辅相成,功能有重叠性,互相不可替代
  • 语法上引用只是一个变量的别名,不开辟内存空间,而指针要存储变量地址,需要开辟内存空间
  • 引用在定义时必须初始化,而指针最好也初始化,不强制
  • 引用在初始化引用一个对象后,不能再引用其他对象,而指针可以不断更改指向对象
  • 引用可以直接访问引用对象,而指针需要解引用
  • sizeof中含义不同,在指针中地址空间所占字节个数为4/8个字节,而引用中sizeof则表示引用对象类型的大小
  • 指针容易出现空指针和野指针的问题,而引用很少出现,相对较安全

在这里插入图片描述


在这里插入图片描述


10. nullptr

  • 在c语言中,经常用NULL为指针进行初始化,而在c++中NULL被定义字面常量0,在c中它被定义为(void*)的常量

在这里插入图片描述


  • C++11中引用了nullptr,它是一个关键字,是一种特殊类型的字面量,它可以转换为任意其他类型的指针类型,使用nullptr定义空指针可以避免类型转换的问题,因此nullptr只能被隐式转换为指针类型,不能转换为整型

11. inline修饰内联函数

  • 用inline修饰的函数就叫内联函数,编译器C++编译器会在调用内联函数时展开内联函数,这样就不用在调用函数时建立栈帧了,可以提高运行效率
  • 内联函数对于编译器而言只是一个建议,通俗点讲,加inline修饰函数后,调用内联函数时编译器也可能不会展开,依旧会创建函数栈帧,所以函数不是+inline修饰后就必须展开
  • 内联函数的使用场景一般是针对那些代码较短,频繁调用的函数,而像递归、代码较长(一般在10行及以上,并不准确,根据编译器而定)并不会展开内联函数,在VS2022编译器debug模式下也不会展开,因为内联函数不可以调试
  • C语言中曾学过宏,宏就是用来替换宏体的,但是由于宏函数实现复杂且容易出错,C++提出的内联函数就是用来替换C语言中的宏函数
  • inline不建议将内联函数的声明和定义分离放在两个文件,因为这样会导致链接失败,因为内联函数展开,就没有了函数地址,链接时就会报错

在这里插入图片描述


在这里插入图片描述


12. 补充知识点(编译和链接)

在这里插入图片描述


在这里插入图片描述


  • 如何改变这种情况呢?

在这里插入图片描述


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

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

相关文章

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件&#xff0c;通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型&#xff0c;分别为胶囊类型&#xff08;Capsule&#xff09;、圆形按钮&#xff08;Circle&#xf…

Opengl光照测试

代码 #include "Model.h" #include "shader_m.h" #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" //以上是放在同目录的头文件#include <glad/glad.h> #include <GLFW/glfw3.…

算法沉淀一:双指针

目录 前言&#xff1a; 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言&#xff1a; 此章节介绍一些算法&#xff0c;主要从leetcode上的题来讲解&#xff…

js识别二维码

需要下载的js文件&#xff1a;https://download.csdn.net/download/impossible1994727/90001718https://download.csdn.net/download/impossible1994727/90001718 或者直接复制也行&#xff1a; var _aa {}; _aa._ab function (f, e) { var d qrcode.width; var b qrcode…

电子应用产品设计方案-11:全自动智能全屋智能系统设计方案

一、设计目标 打造便捷、舒适、安全且节能的全屋智能环境。 二、系统组成 1. 智能灯光系统 - 在客厅、卧室、厨房、卫生间等各处安装智能灯具&#xff0c;可通过手机 APP、语音控制实现开关、调光调色。如客厅设置多种场景模式&#xff0c;如“观影模式”&#xff08;灯光…

现代密码学|古典密码学例题讲解|AES数学基础(GF(2^8)有限域上的运算问题)| AES加密算法

文章目录 古典密码凯撒密码和移位变换仿射变换例题多表代换例题 AES数学基础&#xff08;GF&#xff08;2^8&#xff09;有限域上的运算问题&#xff09;多项式表示法 | 加法 | 乘法X乘法模x的四次方1的乘法 AES加密算法初始变换字节代换行移位列混合轮密钥加子密钥&#xff08…

【idea】更换快捷键

因为个人习惯问题需要把快捷键替换一下。我喜欢用CTRLD删除一下&#xff0c;用CTRLY复制一样。恰好这两个快捷键需要互换一下。 打开file——>setting——>Keymap——>Edit Actions 找到CTRLY并且把它删除 找到CTRLD 并且把它删除 鼠标右键添加CTRLY 同样操作在Delet…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…

通过JS删除当前域名中的全部COOKIE教程

有时候需要通过JS来控制一下网站的登录状态&#xff0c;就例如:网站登出功能&#xff0c;我们可以直接通过JS将所有COOKIE删除&#xff0c;COOKIE删除之后&#xff0c;网站自然也就退出了。 那么今天我就给大家分享一段JS的函数&#xff0c;通过调用这段函数就可以实现删除COO…

【Mysql】Mysql的多表查询---多表联合查询(上)

1、介绍 多表查询就是同时查询两个或者两个以上的表&#xff0c;因为有的时候&#xff0c;用户在查看数据的时候&#xff0c;需要显示的数据来自多张表&#xff0c;多表查询有以下分类&#xff1a; &#xff08;1&#xff09;交叉连接查询&#xff08;产生笛卡尔积&#xff0…

华为Mate 70临近上市:代理IP与抢购攻略

随着科技的飞速发展&#xff0c;智能手机已经成为我们日常生活中不可或缺的一部分。而在众多智能手机品牌中&#xff0c;华为一直以其卓越的技术和创新力引领着行业的发展。近日&#xff0c;华为Mate 70系列手机的发布会正式定档在11月26日&#xff0c;这一消息引发了众多科技爱…

计算机毕业设计Python+Neo4j知识图谱医疗问答系统 大模型 机器学习 深度学习 人工智能 大数据毕业设计 Python爬虫 Python毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

vxe-grid table 校验指定行单元格的字段,只校验某个列的字段

Vxe UI vue vxe-table 中校验表格行是非常简单的&#xff0c;只需要配置好校验规则&#xff0c;然后调用 validate 方法就可以自动完成校验&#xff0c;但是由于项目淡色特殊需求&#xff0c;在某个单元格的值修改后需要对另一个列的值就行校验&#xff0c;这个时候又不需要全部…

记录大学Linux运维上机考试题目和流程

备注&#xff1a;今年的Linux操作系统考试已经全部结束&#xff0c;仅作为一个记录和留念 前提&#xff1a;配置环回网卡和环境和nat网卡 1、搭建dns服务器 2、Apache和http服务 3、搭建postfix邮件服务器实现邮件发送 4、搭建vsftpdFTP服务器实现文件上传 题目如下&…

2024-11-16-机器学习方法:无监督学习(1) 聚类(上)

文章目录 机器学习方法&#xff1a;无监督学习&#xff08;1&#xff09; 聚类&#xff08;上&#xff09;1. 聚类的基本概念1.1 聚类的概念1.2 聚类的功能1.3 聚类的算法 2. 相似度或距离2.1 闵可夫斯基距离2.2 相关系数2.3 夹角余弦 3 类或簇3.1 类的特征 4 类与类之间的距离…

kafka和Flume的整合

目录 一、Kafka作为Source 【数据进入到kafka中&#xff0c;抽取出来】 1、在我的flume的conf文件夹下&#xff0c;有个myconf文件夹&#xff1a; 2、 创建一个flume脚本文件&#xff1a; kafka-memory-logger.conf 3、测试 二、kafka作为Sink 【数据从别的地方抽取到kafka里…

打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

MySQL 8.4.3 Windows绿色安装与主从配置

下载 下载安装包链接&#xff1a; https://dev.mysql.com/downloads/mysql/ 安装配置 假设解压后的目录为C:\mysql-8.4.3-winx64 将C:\mysql-8.4.3-winx64\bin 加入path环境变量在C:\mysql-8.4.3-winx64中创建data文件夹在C:\mysql-8.4.3-winx64中创建my.ini文件 [mysqld]…

文件的简单操作

路径&#xff1a; 代码&#xff1a; main.c #include <stdio.h> #include <stdlib.h> #include <errno.h>int main() {/** 打开文件* FILE *fopen(const char *pathname, const char *mode);*///以追加的方式打开文件FILE* fp fopen("a.txt", &…

【网络】什么是交换机?switch

交换机&#xff08;Switch&#xff09;意为“开关”&#xff0c;是一种用于电&#xff08;光&#xff09;信号转发的网络设备。以下是关于交换机的详细解释&#xff1a; 一、交换机的基本定义 功能&#xff1a;交换机能为接入交换机的任意两个网络节点提供独享的电信号通路&am…