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.rhkb.cn/news/362626.html

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

相关文章

ONLYOFFICE 桌面编辑器 8.1华丽登场

简介&#xff1a;全新ONLYOFFICE 桌面编辑器 8.1解锁全新PDF编辑、幻灯片优化与本地化体验&#xff0c;立即下载&#xff01; 前言&#xff1a;在数字化时代&#xff0c;高效的办公协作工具是企业和个人不可或缺的利器。ONLYOFFICE&#xff0c;作为一款功能强大的云端和桌面办公…

CSS的媒体查询:响应式布局的利器

关于CSS的媒体查询 CSS媒体查询是CSS层叠样式表(Cascading Style Sheets)中的一个核心功能&#xff0c;它使得开发者能够根据不同的设备特性和环境条件来应用不同的样式规则。这是实现响应式网页设计的关键技术&#xff0c;确保网站或应用能够在多种设备上&#xff0c;包括桌面…

python FastAPI操作数据库实现注册登录

代码如下 from fastapi import FastAPI, APIRouter, HTTPException, status from pydantic import BaseModel from fastapi.responses import JSONResponse from typing import Optional from fastapi.middleware.cors import CORSMiddleware from utils.time import DateTime…

React的Props、生命周期

Props 的只读性 “Props” 是 React 中用于传递数据给组件的一种机制&#xff0c;通常作为组件的参数进行传递。在 React 中&#xff0c;props 是只读的&#xff0c;意味着一旦将数据传递给组件的 props&#xff0c;组件就不能直接修改这些 props 的值。所以组件无论是使用函数…

【案例分析:基于 Python 的几种神经网络构建 一维的和二维的全介质和金属SPR 材料的光谱预测与逆向设计】

案例分析&#xff1a;传播相位与几何相位超构单元仿真与器件库提取与二维超构透镜设计与传播光场仿真 案例分析&#xff1a; 片上的超构单元仿真与光学参数提取 案例分析&#xff1a;基于粒子群方法的耦合器设计 案例分析&#xff1a;基于 Python 的几种神经网络构建 一维的和二…

阿里云PAI主机网页访问测试

笔者使用的阿里云平台PAI主机(首次使用免费三个月额度)&#xff0c;由于其默认不设置公网IP&#xff0c;所以在该主机上启动HTTP服务后无法访问测试。 这里使用ssh来作隧道穿透&#xff0c;首先需要配置ssh。 云主机配置ssh 1. 修改root账号密码 在云主机上执行 passwd ro…

示例:WPF中推荐一个支持折叠展开的GridSpliter自定义控件GridSplitterBox

一、目的&#xff1a;推荐一个支持折叠展开的GridSpliter自定义控件GridSplitterBox 二、效果 实现功能&#xff1a;设置菜单显示位置&#xff0c;最小宽度&#xff0c;最大宽度&#xff0c;位置持久化保存 三、环境 VS2022 Net7 四、使用方式 1、安装nuget包&#xff1a;H…

【前端】HTML5基础

目录 0 参考1 网页1.1 什么是网页1.2 什么是HTML1.3 网页的形成 2 浏览器2.1 常用的浏览器2.2 浏览器内核 3 Web标准3.1 为什么需要Web标准3.2 Web标准的构成 4 HTML 标签4.1 HTML语法规范4.1.1 基本语法概述4.1.2 标签关系4.1.2.1 包含关系4.1.2.2 并列关系 4.2 HTML基本结构标…

STL中的迭代器模式:将算法与数据结构分离

目录 1.概述 2.容器类 2.1.序列容器 2.2.关联容器 2.3.容器适配器 2.4.数组 3.迭代器 4.重用标准迭代器 5.总结 1.概述 在之前&#xff0c;我们讲了迭代器设计模式&#xff0c;分析了它的结构、角色以及优缺点&#xff1a; 设计模式之迭代器模式-CSDN博客 在 STL 中&a…

从源码到上线:直播带货系统与短视频商城APP开发全流程

很多人问小编&#xff0c;一个完整的直播带货系统和短视频商城APP是如何从源码开发到最终上线的呢&#xff1f;今天&#xff0c;笔者将详细介绍这一全过程。 一、需求分析与规划 1.市场调研与需求分析&#xff1a;首先需要进行市场调研&#xff0c;了解当前市场的需求和竞争情…

PyCharm2024 for mac Python编辑开发

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

基于Java的汽车租赁系统【附源码】

论文题目 设计&#xff08;论文&#xff09;综述&#xff08;1000字&#xff09; 当今社会&#xff0c;汽车租赁已成为一种受欢迎的出行方式。本文旨在探讨汽车租赁行业的发展趋势、市场规模及其对环境的影响。目前&#xff0c;汽车租赁行业正在经历着快速的发展。随着经济的发…

麒麟系统安装Redis

一、背景 如前文&#xff08;《麒麟系统安装MySQL》&#xff09;所述。 二、下载Redis源码 官方未提供麒麟系统的Redis软件&#xff0c;须下载源码编译。 下载地址&#xff1a;https://redis.io/downloads 6.2.14版本源码下载地址&#xff1a;https://download.redis.io/re…

【实战教程】如何使用JMeter来轻松测试WebSocket接口?

1、websocket接口原理 打开网页&#xff1a;从http协议&#xff0c;升级到websocket协议&#xff0c;请求建立websocket连接服务器返回建立成功成功客户端向服务端发送匹配请求服务端选择一个客服上线服务器返回客服id客户端向服务器发送消息服务器推送消息给指定的客服服务器…

【深度学习】python之人工智能应用篇--跨模态生成技术

跨模态生成技术概述 跨模态生成技术是一种将不同模态的数据&#xff08;如文本、图像、音频、视频等&#xff09;进行融合和转换的技术。其目标是通过将一个模态的数据作为输入&#xff0c;生成与之对应的另一个模态的输出。这种技术对于突破单一模态的局限性&#xff0c;提高…

qt 5.6 qmake手册

qt 5.6 qmake手册 &#xff08;笔者翻译的qmake手册&#xff0c;多数是机翻&#xff0c;欢迎评论区纠错修正&#xff09; Qmake工具有助于简化跨不同平台开发项目的构建过程。它自动生成Makefile&#xff0c;因此创建每个Makefile只需要几行信息。您可以将qmake用于任何软件项目…

“2024国际数字能源展”推动绿色低碳发展,助力实现“双碳”目标

随着全球气候变化问题的日益严峻&#xff0c;构建现代能源体系、推动绿色低碳发展已成为各国共同的使命和追求。在这一背景下&#xff0c;我国提出了“四个革命、一个合作”的能源安全新战略&#xff0c;旨在推动能源生产消费革命&#xff0c;保障国家能源安全&#xff0c;助力…

解锁分布式云多集群统一监控的云上最佳实践

作者&#xff1a;在峰 引言 在当今数字化转型加速的时代&#xff0c;随着混合云、多云多集群环境等技术被众多企业广泛应用&#xff0c;分布式云架构已成为众多企业和组织推动业务创新、实现弹性扩展的首选&#xff0c;分布式云容器平台 ACK One&#xff08;Distributed Clou…

怎么打印加密的Excel文件,有哪些方法?

很多小伙伴都喜欢使用Excel来创建或是编辑表格文档&#xff0c;因为Excel中的功能十分的丰富且强大&#xff0c;在Excel中我们可以对表格文档进行各种操作。有的小伙伴可能在打印时需要给每一页表格添加页码&#xff0c;但又不知道该在哪里找到相关操作&#xff0c;其实很简单&…

第1章 物联网模式简介---独特要求和体系结构原则

物联网用例的独特要求 物联网用例往往在功耗、带宽、分析等方面具有非常独特的要求。此外&#xff0c;物联网实施的固有复杂性&#xff08;一端的现场设备在计算上受到挑战&#xff0c;另一端的云容量几乎无限&#xff09;迫使架构师做出艰难的架构决策和实施选择。可用实现技…