【C++入门】 初见,单推,与C++的第一次约会

news/2024/5/9 20:27:21

在这里插入图片描述关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒


引言:本篇博客我们开始与C++的第一次约会,C++是兼容c的,本篇博客我们将了解到C++关键字有哪些,C++命名空间,C++输入与输出和缺省参数的内容,请放心食用 ~

文章目录

  • 一 🏠 C++关键字
  • 二 🏠 C++命名空间
    • 👿 命名空间的定义
    • 👿 命名空间的使用
      • 📒 加命名空间名称及作用域限定符
      • 📒 展开命名空间
      • 📒 指定展开空间的某一个
  • 三 🏠 C++输入与输出
    • 👿 cout和cin
    • 关于std命名空间
  • 四 🏠 缺省参数
    • 👿 缺省参数的概念
    • 👿 缺省参数的分类

一 🏠 C++关键字

C++跟C语言一样也有属于它自己关键字,但是由于C++兼容c,关键字中有些是我们的老朋友,有些是新朋友,我们可以在后期慢慢了解
在这里插入图片描述

二 🏠 C++命名空间

我们首先看这样的一段代码

#include<stdlib.h>
#include<stdio.h>
int rand = 0;int main()
{printf("%d",rand);return 0;
}

这段代码能否正常输出这个全局变量rand的值呢?

答案是否定的,这是因为我们包含了rand函数的头文件,他和rand变量都在全局域中,这导致编译器懵逼了会起冲突。

这里我们补充一个知识点:我们在用变量/函数..时,编译器默认查找顺序是1.局部域 2.全局域

那有什么解决之法呢 ? C++ 给了一个新技术叫做 命名空间(namespace)

👿 命名空间的定义

  • 语法
namespace 空间名
{int rand = 10; // 定义变量int Add(int x,int y){return x + y;} //定义函数struct Node{}; //定义类型
} //注意这里没有分号 ! !

命名空间里可以定义变量,函数,类型

// test.cpp
namespace N1
{
int a;
int b;
int Add(int left, int right){return left + right;}
namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}

命名空间也可以嵌套命名空间,有什么使用场景呢?

namespace bit
{namespace f{void Add(int x, int y){cout << 2*x + y << endl;}}}
namespace f
{int x;void Add(int x, int y){cout << x + y << endl;}struct Node{};
}
int main()
{bit::f::Add(1, 2);f::Add(1, 2);return 0;
}

如上代码 当你想用两个同名命名空间里的东西时,就可以嵌套命名空间。

//test.h
#include<iostream>
using namespace std;
namespace f
{void Sub(int x ,int y){cout << x - y << endl;}
}
//test.cpp
namespace f
{int x;void Add(int x, int y){cout << x + y << endl;}struct Node{};
}
#include"test.h"
int main()
{bit::f::Add(1, 2);f::Add(1, 2);f::Sub(1, 2);return 0;
}

输出结果:3 -1 可以正常编译

我们可以发现:同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

👿 命名空间的使用

📒 加命名空间名称及作用域限定符

:: 是C++中的作用域限定符,左边没东西默认访问全局

namespace f
{int x = 2;;void Add(int x, int y){cout << x + y << endl;}struct Node{};
}
int x = 0;
int main()
{cout << ::x << endl;//使用全局的bit::f::Add(1, 2); //使用嵌套命名空间的函数cout << f::x << endl;//使用命名空间定义的变量f::Add(1, 2); //使用命名空间定义的函数struct f::Node pnode;//使用命名空间定义的类型return 0;
}

📒 展开命名空间

命名空间的本质是定义一个命名空间域展开命名空间实际是增加编译器查找的顺序,除了在局部域和全局域找还在命名空间域找,它实际是一个声明,声明你可以访问这块空间

using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0;    
}

对于代码中的b,由于展开了命名空间,先在局部域找,没找到再在全局域,最后在再在命名空间域里找

namespace f1
{int val = 0;
}
namespace f2
{int val = 1;
}
using namespace f1;
using namespace f2;
cout << val << endl;

代码不能正常编译

注意:展开多个命名空间时,空间里有同名的会起冲突,所以尽量不要随意展开!!

📒 指定展开空间的某一个

namespace N
{
int b = 0;
}
using N::b;
int main()
{printf("%d\n", b);return 0;    
}

如果我们要解决上面的问题可不可以代码是这样的?

namespace N
{
int rand = 0;
}
using N::rand;
int main()
{printf("%d\n", b);return 0;    
}

在这里编译器会报错,原因是展开指定中的某一个实际是一个声明,声明你可以访问这块命名空间里的rand,但是会与全局域的rand函数冲突,编译器不知道到底要用哪个rand

printf("%d\n", N::b);

这种写法明确告诉你要访问的是N这个命名空间里的rand

注意:命名空间域并不会改变生命周期

三 🏠 C++输入与输出

我们的C++祖师爷对C语言的输入和输出函数感到不足,所也设计了新的输入和输出函数

👿 cout和cin

std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中

#include<iostream>
using namespace std;int a;double b;char c;// 可以自动识别变量的类型cin>>a;cin>>b>>c;cout << a << "" << b <<endl<<'\n'//换行可以使用endl或‘\n’

注意:

  1. <<是流插入运算符,>>是流提取运算符
  2. cin 和 cout 可以自动识别类型
  3. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  4. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。

使用cout

//1.
using nampspace std;
//2.
std::cout
//3.
using std:: cout;
using std::endl;

关于std命名空间

我们前面说了最好不要随意展开命名空间,这是必须的吗?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用.

四 🏠 缺省参数

👿 缺省参数的概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。

void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func();     // 没有传参时,使用参数的默认值Func(10);   // 传参时,使用指定的实参
return 0;
}

输出:
0
10

如果没有指定实参则采用该形参的缺省值,否则使用指定的实参

👿 缺省参数的分类

  • 全缺省参数
    指的是给每个形参一个默认值
void Func(int a = 10, int b = 20, int c = 30){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}Func(1,2,3); //输出1 2 3Func(1,2);//1 2 30Func(1);//1 20 30//不能是Func(1,,3);
  • 半缺省参数
    指的是给一部分缺省参数
void Func(int a, int b = 10, int c = 20){cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;}//不能在函数和声明同时缺省//a.hvoid Func(int a = 10);// a.cppvoid Func(int a = 20){}

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现(如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值)
  3. 缺省值必须是常量或者全局变量
  4. C语言不支持

应用场景:比如我们给链表扩容时如果知道要扩多少直接给形参,不知道就用缺省参数作为指导扩容值.


看完不妨给个一键三连呀 ~


http://www.mrgr.cn/p/21467326

相关文章

【论文速读】| 对大语言模型解决攻击性安全挑战的实证评估

本次分享论文为&#xff1a;An Empirical Evaluation of LLMs for Solving Offensive Security Challenges 基本信息 原文作者&#xff1a;Minghao Shao, Boyuan Chen, Sofija Jancheska, Brendan Dolan-Gavitt, Siddharth Garg, Ramesh Karri, Muhammad Shafique 作者单位&a…

【Selenium】隐藏元素的定位和操作|隐藏与isDisplay方法

一、selenium 中隐藏元素如何定位&#xff1f; 如果单纯的定位的话&#xff0c;隐藏元素和普通不隐藏元素定位没啥区别&#xff0c;用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素&#xff08;如click,clear,send_keys&#xff09; 二、隐藏元素 如下图有个输入框…

【搜索引擎2】实现API方式调用ElasticSearch8接口

1、理解ElasticSearch各名词含义 ElasticSearch对比Mysql Mysql数据库Elastic SearchDatabase7.X版本前有Type&#xff0c;对比数据库中的表&#xff0c;新版取消了TableIndexRowDocumentColumnmapping Elasticsearch是使用Java开发的&#xff0c;8.1版本的ES需要JDK17及以上…

Amazon SageMaker + Stable Diffusion 搭建文本生成图像模型

如果我们的计算机视觉系统要真正理解视觉世界&#xff0c;它们不仅必须能够识别图像&#xff0c;而且必须能够生成图像。文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。 近两年&#xff0c;以ChatGPT为代表的AIGC技术崭露头角&#xff0c;逐渐从学术研究的象牙塔迈…

回文子串 每日温度 接雨水

647. 回文子串 力扣题目链接 如果s【i】和s【j】相同 dp【i1】【j-1】也是回文串的话 &#xff08;等于true&#xff09; 那么dp【i】【j】也是回文串 true 定义一个bool二维数组 遍历顺序是从下到上 从左到右 因为dp【i】【j】是通过dp【i1】【j-1】推出来的 i从最后一…

CI/CD实战-jenkins部署 3

安装 软件下载地址&#xff1a;Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 启动服务 安装推荐插件 不新建用户&#xff0c;使用admin账号登录 修改一下初始密码 新建项目测试 安装git命令 生成密钥 在gitlab中上传公钥 修改ssh 创建中…

AQS源码分析

前言 AbstractQueuedSynchronizer是抽象同步队列&#xff0c;其是实现同步机器的基础组件&#xff0c;并发包中的锁的底层就是使用AQS实现的。AQS中 维护了一个volatile int state&#xff08;代表共享资源&#xff09;和一个FIFO线程等待队列&#xff08;多线程争用资源被阻塞…

培训机构必备,乔拓云教育系统助你快速上线移动学员端口

在当今数字化时代&#xff0c;自媒体平台已经成为人们获取信息、学习新知识的重要渠道。而对于培训机构而言&#xff0c;如何有效利用这些平台&#xff0c;将优质课程推广给更多学员&#xff0c;成为了一个亟待解决的问题。现在&#xff0c;乔拓云教育系统为你提供了一个全新的…

Unity DOTS中的baking(四)blob assets

Unity DOTS中的baking&#xff08;四&#xff09;blob assets blob assets表示不可变的二进制数据&#xff0c;在运行时也不会发生更改。由于blob assets是只读的&#xff0c;这意味着可以安全地并行访问它们。此外&#xff0c;blob assets仅限于使用非托管类型&#xff0c;这意…

esp32CAM环境搭建(arduino+MicroPython+thonny+固件)

arduino ide 开发工具 arduino版本&#xff1a;1.8.19 arduino ide 中文设置&#xff1a;​ file >> preferences >> ​ arduino IDE 获取 ESP32 开发环境&#xff1a;打开 Arduino IDE &#xff0c;找到 文件>首选项 ,将 ESP32 的配置链接填入附加开发板管理网…

在CentOS7上模拟使用dbt2 tpc-c测试(未成功)为vm虚拟机加装硬盘解决secure-file-priv o问题解决(OS errno 13 - Permission denied)

给虚拟机加装硬盘 //虚拟机➡设置➡硬盘➡添加[root@localhost ~]# fdisk /dev/sdb //新硬盘分区 欢迎使用 fdisk (util-linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。Device does not contain a recognized partition table …

小米汽车供应商产业链分析

小米汽车供应商产业链分析 参考文献链接 https://mp.weixin.qq.com/s/EXhutqS4Izx4rDBxPrxkeg https://mp.weixin.qq.com/s/8413Va67SWucDvDahH_XFw人工智能芯片与自动驾驶

U盘未格式化,数据恢复攻略大揭秘

U盘遭遇未格式化困境&#xff0c;数据安全岌岌可危 在日常的工作和生活中&#xff0c;U盘以其便携、容量大的特性成为了我们不可或缺的存储工具。然而&#xff0c;有时我们会遇到这样一个棘手的问题&#xff1a;当我们将U盘插入电脑时&#xff0c;却收到了“未格式化”的提示。…

冗余双写方案下数据一致性问题解决及延申问题处理方案

主要整理了采用冗余双写方案后的问题解决方案。 1、问题&#xff1a;冗余双写场景下&#xff0c;如何解决数据一致性问题&#xff1f; 方案一&#xff1a; 直接RPC调用Seata分布式事务框架&#xff0c;采用该方式实现了事务的强一致性&#xff0c;代码逻辑简单的同时业务侵入…

win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present

问题 在安装了docker windows版本后启动 docker报错docker desktop windows hypervisor is not present 解决措施 首先确认windows功能是否打开Hyper-v 勾选后重启&#xff0c;再次启动 启动后仍报这个错误&#xff0c;是Hyper-v没有设置成功 使用cmd禁用再启用 一.禁用h…

STM32的SPI通信介绍

SPI简介 SPI:串行外设接口,与IIC一样都是通用数据总线。四根通信线&#xff1a;SCK&#xff0c;MOSI&#xff08;DO&#xff09;&#xff0c;MISO&#xff08;DI&#xff09;&#xff0c;SS。同步&#xff08;共用一根时钟线&#xff09;&#xff0c;全双工&#xff08;数据发…

每日一题 --- 删除链表的倒数第 N 个结点[力扣][Go]

删除链表的倒数第 N 个结点 题目&#xff1a;19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#x…

时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN…

饼图渲染的关键

1) 创建一个DOM对象,有自定义的高和宽. 2) 引入Echarts软件包并导入到对应文件内 npm i Echarts import 文件.js script src.../文件 3) 初始化一个对象 4) 对象的方法实现饼图渲染 data内的数据,且当一个对象已经渲染一遍,再执行这个,会对setOption的参数进行更新,其…