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. 引用比指针使用起来相对更安全

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

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

相关文章

鸿蒙NEXT,保障亿万中国老百姓数据安全的操作系统

吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 上周华为发布了最新的鸿蒙NEXT操作系统&#xff0…

windows系统上nginx搭建文件共享

1、下载windows版nginx 下载地址 2、配置nginx 编辑nginx.conf配置文件 在http模块下添加这个参数 underscores_in_headers on;#修改location内容&#xff0c;共享哪个文件夹&#xff0c;就写哪个文件夹&#xff0c;最后一定要跟上/&#xff0c;否则无法访问 location / {…

深入解析Ansible

文章目录 引言Ansible的原理Ansible的使用安装Ansible配置Ansible编写Playbook执行Playbook Ansible的优缺点Ansible的优点Ansible的缺点 总结 引言 在现代IT运维中&#xff0c;自动化工具扮演着至关重要的角色。Ansible作为一款开源的自动化运维工具&#xff0c;凭借其易用性…

Depth Anything环境搭建推理测试

引子 基于单目摄像头的深度估计&#xff0c;一直是CV领域的一个难点&#xff0c;之前也对此关注也不够多。偶然浏览技术博客&#xff0c;看到Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data这个最新CVPR2024的工作。看到名字&#xff0c;大概也能猜出来…

【机器学习300问】130、什么是Seq2Seq?又叫编码器(Encoder)和解码器(Decoder)。

Seq2Seq&#xff0c;全称为Sequence to Sequence&#xff0c;是一种用于处理序列数据的神经网络模型&#xff0c;特别适用于如机器翻译、语音识别、聊天机器人等需要将一个序列转换为另一个序列的任务。这种模型由两部分核心组件构成&#xff1a;编码器&#xff08;Encoder&…

服务器(Linux系统的使用)——自学习梳理

root表示用户名 后是机器的名字 ~表示文件夹&#xff0c;刚上来是默认的用户目录 ls -a 可以显示出隐藏的文件 蓝色的表示文件夹 白色的是文件 ll -a 查看详细信息 total表示所占磁盘总大小 一般以KB为单位 d开头表示文件夹 -代表文件 后面得三组rwx分别对应管理员用户-组…

shell的正则表达------awk

一、awk&#xff1a;按行取列 1.awk原理&#xff1a;根据指令信息&#xff0c;逐行的读取文本内容&#xff0c;然后按照条件进行格式化输出。 2.awk默认分隔符&#xff1a;空格、tab键&#xff0c;把多个空格自动压缩成一个。 3.awk的选项&#xff1a; awk ‘操作符 {动作}’…

pytorch库 03 基础知识

文章目录 一、准备工作二、tensorboard的使用1、add_scalar()方法2、add_image()方法 三、transforms的使用1、ToTensor()类2、常见transforms的类 三、torchvision中的数据集使用 官网 https://pytorch.org/ 一、准备工作 ①在pycharm和jupyter上&#xff0c;检查当前系统是…

构建LangChain应用程序的示例代码:42、如何使用 `LLMCheckerChain` 来验证和校正由大型语言模型(LLM)生成的文本

自我检查链使用指南 概述 本指南展示了如何使用 LLMCheckerChain 来验证和校正由大型语言模型&#xff08;LLM&#xff09;生成的文本。 代码示例 from langchain.chains import LLMCheckerChain # 导入 LLMCheckerChain 类 from langchain_openai import OpenAI # 导入 …

SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】

Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(“MyInterceptor.afterCompletion”); } } 使用Java的形式配置拦截器的拦截路径 在WebMvcConfig…

记录:windows 命令板快捷键

dir 列出当前目录下的所有文件cd 目录名&#xff1a; cd. 进入当前目录 cd…进入上一层目录md 目录名 创建文件夹rd 目录名 删除文件夹cd.>文件名.后缀名 比如 cd.>a.txtcls 清除exit 退出

与亚马逊云科技深度合作,再获WAPP、ISV认证

上半年&#xff0c;VERYCLOUD睿鸿股份加入亚马逊云科技的WAPP&#xff08;Well-Architected Partner Programs&#xff09;和ISV加速计划&#xff08;ISV Accelerate Program&#xff09;&#xff0c;为客户带来更坚实优质的海外云服务。 Well-Architected 获得WAPP这项认证代表…

Oracle day11

/*create table tbemp --职员表 ( eid number(7) primary key, --职员编号 ename varchar2(20) not null, --职员姓名 esex varchar2(3) not null check(esex in(男,女)), eage number not null check(eage>18), eaddr varchar2(50) …

比较(四)利用python绘制平行坐标图

比较&#xff08;四&#xff09;利用python绘制平行坐标图 平行坐标图&#xff08;Parallel coordinate plot&#xff09;简介 平行坐标图可以显示多变量的数值数据&#xff0c;最适合用来同一时间比较许多变量&#xff0c;并表示它们之间的关系。缺点也很明显&#xff0c; 不…

自己只能跑llama3-8b模型,告诉你一个免费使用llama3-70b的方法

我们前期介绍了Llama 3大模型&#xff0c;以及本地部署了Llama 3 8b模型&#xff0c;但是想体验一下llama3-70b的模型的话&#xff0c;需要很大的计算资源&#xff0c;且要求极高的内存。llama3-8b的模型约4.7G &#xff0c;而llama3-70b的模型约40G&#xff0c;若想在自己的电…

Servlet常用类剖析

通过继承HttpServlet实现Servlet程序 实际开发中&#xff0c;一般使用继承HttpServlet类的方法去实现Servlet程序。 步骤&#xff1a; 1、编写一个类去继承HttpServlet类 2、根据业务需要重写doGet或doPost方法 3、到web.xml中配置Servlet程序 1、编写一个类&#xff0c;Altin…

Spring整合CXF,发布RSETful 风格WebService

import javax.ws.rs.core.MediaType; import com.hoo.entity.MapBean; import com.hoo.entity.User; import com.hoo.entity.Users; /* 注释&#xff08;Annotation&#xff09;&#xff1a;在 javax.ws.rs.* 中定义&#xff0c;是 JAX-RS (JSR 311) 规范的一部分。 Path…

【蓝队小WIKI】攻防演练中防守方重点知识点整理

一、蓝队防守策略&#xff1a; 工作流程概述 Hvv蓝队技战法&#xff1a;Hvv蓝队技战法 - FreeBuf网络安全行业门户 3个阶段&#xff0c;4大要点&#xff0c;蓝队防守全流程纲要解读&#xff1a;攻防演练合集 | 3个阶段&#xff0c;4大要点&#xff0c;蓝队防守全流程纲要解读 -…

oracle 11g rac安装grid 执行root脚本add vip -n 。。。on node= ... failedFailed 错误处理

问题&#xff1a; CRS-4402: The CSS daemon was started in exclusive mode but found an active CSS daemon on node racdg1-1, number 1, and is terminating An active cluster was found during exclusive startup, restarting to join the cluster PRCN-2050 : The requ…

js小题:通过字符串执行同名变量怎么做

在JavaScript中&#xff0c;你不能直接使用一个字符串来直接引用一个变量&#xff0c;因为JavaScript是一种静态类型语言&#xff08;尽管它的类型在运行时可以变化&#xff09;&#xff0c;变量的名字在编译时就被确定了。但是&#xff0c;有几种方法可以实现类似的功能&#…