当前位置: 首页 > news >正文

C++ 入门

前言 c++的发展史:

C++的起源可以追溯到1979年,当时Bjarne Stroustrup在贝尔实验室开始开发一种名为“C with Classes”的语言。以下是C++发展的几个关键阶段:

  1. 1979年:Bjarne Stroustrup在贝尔实验室开始开发“C with Classes”。
  2. 1983年:语言正式命名为C++,添加类、继承、函数重载等特性。
  3. 1985年:发布《The C++ Programming Language》一书,标志C++的正式发布。
  4. 1998年:发布第一个国际标准版本C++98。
  5. 2011年:发布C++11,加入自动类型推导、lambda表达式、智能指针等新特性。
  6. 2014年:发布C++14,进行小幅改进。
  7. 2017年:发布C++17,新增结构化绑定、std::optional等特性。
  8. 2020年:发布C++20,引入概念、协程、模块等重大更新。

C++的演进不断增加新特性,提升性能和编程效率,适应现代开发需求。

一 命名空间:

在C语言中我们定义变量函数rand但是它是<stdli.b>库里面的函数,这时编译器无法区分它到底是库里面的函数还是全局变量rand,那么它们发生就会冲突,因为C语言规定定义的变量不能与库里面的函数和那32个关键字一样,如果我因为某种需求需要定义一样的变量那这时候就会出错,这时候c++中的namespace就是为了针对此类问题

namespace:

定义:namespace 是 C++ 中的一个关键字,用于定义命名空间。命名空间是一个逻辑上分组的机制,主要用来解决命名冲突问题。通过使用命名空间,可以将相同名称的标识符(如变量、函数、类等)放在不同的命名空间中,从而避免冲突。

命名空间定义:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
namespace bit
{int rand = 10;
}int main()
{printf("%d", bit::rand);return 0;
}

输出:

首先我们来定义一个命名空间需要使用到namespace关键字后面需要跟一个命名空间(结束后不需要加;),其中命名空间可以是函数变量类型。要访问命名空间中的成员,可以使用 :: 运算符

using命名:

我们在程序中频繁的使用命名空间里面的特定变量那需要输出多少个就需要多少个::运算符(作用域解析运算符),那c++用using可以直接访问a而不需要bit::前缀。就很好的解决了这个问题

#include <stdio.h>
#include <stdlib.h>namespace bit
{int rand = 10;int a = 0;
}
using bit::a;
//using bit::rand;
int main()
{printf("%d\n",bit::rand);printf("%d", a);return 0;
}

输出:

如果我们用被注释过的代码呢,你们觉得它会不会报错?答案是“会” 原因是rand本来是库函数但是它在命名空间里面所以不会报错,但是现在using想让rand变为全局变量那这不又与库函数冲突了嘛

using namespace 命名:

上面using命名规则就是把你a变量给释放出来而这个就是不管你三七二十一全给它释放出来,但是
但是在编写项目的过程中就容易发生冲突了,所以我还是推荐用什么释放什么,或者带着 :: 来明确指定变量是来自哪个 namespace 的

#include <stdio.h>
#include <stdlib.h>namespace bit
{int rand = 250;int a = 300;
}
using namespace::bit;
int main()
{printf("%d\n",rand);printf("%d", a);return 0;
}

输出

命名空间嵌套:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>namespace bit
{int rand = 10;namespace abt{int b = 11;}
}int main()
{printf("%d\n", bit::rand);printf("%d", bit::abt::b);return 0;
}

输出:

在同一个工程文件中如果有多个相同的命名空间那到最后都会和到一起的

二 c++中输入输出:

#include <iostream>
using namespace std;
int main()
{cout << "Hello World" << endl;return 0;
}

在初识c++时是不是总是以为最上面的两行代码是每次写代码都要加上去,其实是因为要在 C++ 中执行任何输入和输出操作,我们需要使用 iostream 头文件。如果没有 <iostream> 头文件,我们就无法从用户那里获取输入或打印任何输出。第二行中我们只是不知道为什么要写个std 

std:: 是个命名空间标示符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准函数库中的函数或对象都要使用std来限定。如果说需要调用要调用C++标准库时,要写上std::

三 缺省参数:

缺省参数是指在函数声明时,为参数指定一个默认值。在调用该函数时,如果省略了该参数,编译器会自动使用默认值。

#include <iostream>
using namespace std;
void Fun(int a = 10)
{cout << a << endl;
}
int main()
{//cout << "Hello World" << endl;Fun();//没传参数就用形参的指定默认值Fun(100);//传参数就用实参的值return 0;
}

输出:

全缺省参数:

完整默认参数,也称为完全默认参数,是指为函数的所有参数分配默认值。这意味着,如果函数的调用者省略了任何参数,则将使用相应的默认值。

#include <iostream>
using namespace std;
void Fun(int a = 10 , int b = 200 , int c = 300)
{cout << a  << endl;cout << b << endl;cout << c << endl;
}
int main()
{//cout << "Hello World" << endl;Fun();return 0;
}

半缺省参数:

部分默认参数涉及仅为函数参数的子集分配默认值。其余参数没有默认值,必须由调用者提供。

#include <iostream>
using namespace std;
void Fun(int a = 10 , int b = 200 , int c)
{cout << a  << endl;cout << b << endl;cout << c << endl;
}
int main()
{//cout << "Hello World" << endl;Fun(100 , 20 , 30);return 0;
}

1. 半缺省参数必须从右往左依次来给出,不能间隔着给

2. 缺省参数不能在函数声明和定义中同时出现

3. 缺省值必须是常量或者全局变量

4. C语言不支持(编译器不支持)

四 函数重载:

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。

参数类型不同:

#include <iostream>
using namespace std;
void Swap(int a , int b)
{cout << a  << endl;cout << b << endl;
}
void Swap(double a , float b)
{cout << a << endl;cout << b << endl;
}
int main()
{//cout << "Hello World" << endl;Swap(10 , 20);Swap(11.0 , 200.0);return 0;
}

输出:

参数个数不同:

#include <iostream>
using namespace std;
void Swap()
{cout << "f()" << endl;
}
void Swap(char b)
{cout << b << endl;
}
int main()
{//cout << "Hello World" << endl;Swap();Swap('b');return 0;
}

输出:

参数顺序不同:

#include <iostream>
using namespace std;
void Swap(int a, char b)
{cout << a << endl;cout << b << endl;
}
void Swap(char b, int a)
{cout << b << endl;cout << a << endl;
}
int main()
{//cout << "Hello World" << endl;Swap(10 , 'a');Swap('b', 200.0);return 0;
}

输出:

五 引用:

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。

语法:

数据类型& 引用名  = 引用实体

#include <iostream>
using namespace std;int main()
{int a = 200;int& b = a;//b是a的引用cout << a << endl;cout << b << endl;return 0;
}

引用类型和引用实体必须是同种类型又因为它们是共用同一块空间所以不管是a或b变量谁改变那都会一起改变

输出:

   地址:

  值:

引用在定义时必须要初始化

一个变量可以有多个引用

引用一旦引用一个实体就不能再引用另外一个实体

常引用:

#include <iostream>
using namespace std;
int mian()
{//权力的放大
const int a = 200;
int& b = a;//引用
cout << a << endl;
cout << b << endl;
return 0;
}

输出:

#include <iostream>
using namespace std;
int mian()
{
//权力的缩小
int i = 10;
const int& j = i;
cout << i << endl;
cout << j << endl;
return 0;
}

输出:

#include <iostream>
using namespace std;
int mian()
{
//权力的平移
const int q = 101;
const int& w = q;
cout << q << endl;
cout << w << endl;
return 0;
}

输出:

综上所述权力可以平移 缩小但是不能放大。

引用与指针的比较:

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

引用和指针的不同点:

1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

2. 引用在定义时必须初始化,指针没有要求

3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体

4. 没有NULL引用,但有NULL指针

5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)

6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

7. 有多级指针,但是没有多级引用

8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

9. 引用比指针使用起来相对更安全

相关文章:

C++ 入门

前言 c的发展史&#xff1a; C的起源可以追溯到1979年&#xff0c;当时Bjarne Stroustrup在贝尔实验室开始开发一种名为“C with Classes”的语言。以下是C发展的几个关键阶段&#xff1a; 1979年&#xff1a;Bjarne Stroustrup在贝尔实验室开始开发“C with Classes”。1983…...

GPT-5发布倒计时:AI智能从高中生到博士生的跨越

嘿&#xff0c;小伙伴们&#xff01;最近有个大新闻&#xff0c;OpenAI的首席技术官米拉穆拉蒂在一次采访中透露&#xff0c;GPT-5将在一年半后发布。她把这个升级比作从聪明的高中生到博学的博士生的飞跃&#xff0c;听起来是不是很酷&#xff1f; 现在GPT-4o还有不少功能没上…...

Docker 拉取镜像失败处理 配置使用代理拉取

解决方案 1、在 /etc/systemd/system/docker.service.d/http-proxy.conf 配置文件中添加代理信息 2、重启docker服务 具体操作如下&#xff1a; 创建 dockerd 相关的 systemd 目录&#xff0c;这个目录下的配置将覆盖 dockerd 的默认配置 代码语言&#xff1a;javascript 复…...

视频汇聚安防综合管理系统EasyCVR平台GB28181设备注册未上线的原因排查与解决

视频汇聚安防综合管理平台EasyCVR视频监控系统基于云边端架构&#xff0c;可支持海量视频汇聚集中管理&#xff0c;能提供视频监控直播、云端录像、云存储、录像检索与回看、告警&#xff08;协议告警/智能告警/1400视图库告警&#xff09;、平台级联、AI智能分析接入等视频能力…...

【性能优化】Android冷启动优化

文章目录 常见现象APP的启动流程计算启动时间Displayed Timeadb dump 启动优化具体策略总结参考链接 常见现象 各种第三方工具初始化和大量业务逻辑初始化&#xff0c;影响启动时间&#xff0c;导致应用启动延迟、卡顿等现象 APP的启动流程 加载和启动应用程序&#xff1b; …...

Git拉完整代码缺少某个类

已找到具体问题&#xff0c;对比之后发现应该是拉去的文件名字字符太长导致&#xff01; 使用 Git LFS Git LFS&#xff08;Large File Storage&#xff09;是 Git 的一个扩展&#xff0c;它可以帮助管理大型文件&#xff0c;包括长文件名。如果你的项目包含大量的大型文件或长…...

Windows资源管理器down了,怎么解

ctrlshiftesc 打开任务管理器 文件 运行新任务 输入 Explorer.exe 资源管理器重启 问题解决 桌面也回来了...

锐捷统一上网行为管理与审计系统 static_convert.php 前台RCE漏洞复现

0x01 产品简介 锐捷统一上网行为管理与审计RG-UAC系列是星网锐捷网络有限公司自主研发的上网行为管理与审计产品,具备的上网行为日志审计功能,能够全面、准确、细致的审计并记录多种上网行为日志,包括网页、搜索、外发文件、邮件、论坛、IM等等,并对日志数据进行统计分析,…...

在Linux/Ubuntu/Debian中使用SSH连接远程服务器VPS

在Linux/Ubuntu/Debian中使用SSH连接远程服务器VPS 在远程管理服务器时&#xff0c;SSH&#xff08;Secure Shell&#xff09;协议是我们常用的工具之一。它提供了一种加密的方式来访问和管理远程主机。默认情况下&#xff0c;SSH使用22端口&#xff0c;但有时我们需要通过指定…...

如何安全进行亚马逊、沃尔玛测评?

在亚马逊、沃尔玛、速卖通、阿里国际站等电商平台上&#xff0c;测评已成为一种高效的推广手段&#xff0c;但伴随的风险也不容忽视。这些风险主要源于平台严格的大数据风控机制&#xff0c;它涵盖了多个方面&#xff0c;以确保评价的真实性和合规性。 首先&#xff0c;硬件参数…...

自动化喷涂生产线控制方法概述

喷涂生产线涉及控制机械臂及传送带等&#xff0c;以及触摸屏人机界面&#xff0c;以及各种电机&#xff0c;电磁阀等&#xff0c;本文针对具体控制方法进行讨论。 一套自动化喷涂生产线装配完成后&#xff0c;进入到控制调试阶段&#xff0c;首先要进行工艺参数的设置&#xff…...

【Linux】Centos升级到国产操作系统Openeuler

一、前言 迁移工具采用Openeuler官网提供的x2openEuler工具&#xff0c;是一款将源操作系统迁移到目标操作系统的迁移工具套件&#xff0c;具有批量化原地升级能力&#xff0c;当前支持将源 OS 升级至 openEuler 20.03。 官网链接&#xff1a;openEuler迁移专区 | 迁移专区首页…...

【扫雷游戏】C语言详解

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…...

自定义平台后台登录地址前缀的教程

修改平台后台地址默认的 admin 前缀 修改后端 config/admin.php 配置文件,为自定义的后缀修改 平台后台前端源码中 src/settings.js 文件,修改为和上面一样的配置修改后重新打包前端代码,并且覆盖到后端的 public 目录下重启 swoole 服务即可...

kylin v10 离线安装chrome centos离线安装chrome linux离线安装谷歌浏览器

1. 先用自己联网的计算机&#xff0c;下载离线安装包&#xff0c;浏览器输入链接下载安装包&#xff1a; https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 1.2. 信创环境不用执行下面&#xff0c;因为没网 1.3. 若为阿里云服务器&#xff0c;或服…...

AI交互及爬虫【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…...

001、DM8安装

参照&#xff1a;https://eco.dameng.com/document/dm/zh-cn/pm/install-uninstall.html 1. 准备工作 操作系统查看 [rootora19c ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)新建用户 [rootora19c ~]# groupadd dinstall -g 2001 [rootora19c ~]# …...

SEO之关键词趋势波动和预测

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、新手上云 前面研究关键词搜索次数时&#xff0c;通常只看一段时间的搜索次数&#xff0c;比如一个月之内。但绝大多数关…...

k8s学习--chart包开发(创建chart包)

文章目录 chart包应用环境一、安装helm客户端工具二、chart包目录结构三、创建不可配置的chart1.创建目录和chart.yaml2.创建deployment.yaml3.创建service.yaml4.使用chart安装应用5.查看和验证 四、创建可配置的Chart1.官方的预定义变量2.新增values.yaml文件3.配置deploy引用…...

【STM32】中断应用概述

前面我们知道在手册中有一个中断向量表&#xff0c;初步了解了中断的概念。 1.NVIC简介 NVIC是嵌套向量中断控制器&#xff0c;控制着整个芯片中断相关的功能&#xff0c;它跟内核紧密耦合&#xff0c;是内核里面的一个外设。 在固件库中&#xff0c;NVIC的结构体定义可谓是…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...