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

C/C++ C++入门

个人主页:仍有未知等待探索-CSDN博客

专题分栏:C++_仍有未知等待探索的博客-CSDN博客

目录

一、C++关键字

二、命名空间

1、区别

1. C语言

​编辑 2. C++

2、命名空间定义

 3、命名空间的使用

三、C++输入&输出

四、缺省参数

五、函数重载

六、引用

使用注意:

引用和指针的区别:

 引用的使用:

七、内联函数

八、auto关键字(C++11)

九、基于范围的for循环(C++11)

十、指针空值---nullptr(C++11)


一、C++关键字

下列的关键字有的我们在C语言中就已经见过了,而有些比较陌生,不过不用慌,这些现在不用死记,以后多用就记住了。

二、命名空间

在C/C++中,变量,函数和类的名称都存在于全局作用域中,而C++为了避免这样的命名冲突和名字污染,添加了命名空间域。(关键字:namespace)

全局作用域和命名空间域就类似于这样(如果理解不对,请指教),相当于单独开了一个空间给命名空间域。

1、区别

1. C语言

在没有命名空间的C语言语法里这样写就是错误的,报错信息可以看见:rand重定义。

 2. C++

定义了一个命名空间,在命名空间里面定义了一个rand变量,这样的话就不会和库函数里面的rand函数产生命名冲突。(:: 这个符号作用域限定符)

2、命名空间定义

#include <iostream>// 正常定义
namespace cpp1
{int a = 1;int b = 2;int Add(int a, int b){return a + b;}
}
// 嵌套定义
namespace cpp2
{int a = 1;int b = 2;int Add(int a, int b){return a + b;}namespace cpp3{int a = 1;int b = 2;int Add(int a, int b){return a + b;}}
}// 一个工程里面允许定义多个相同的命名空间——编译器最后会合成同一个命名空间中。int main()
{// 打印cpp2里面的函数printf("%d\n", cpp2::Add(1, 2));// 打印cpp2里面的cpp3里面的函数printf("%d\n", cpp2::cpp3::Add(3, 4));return 0;
}

 3、命名空间的使用

#include <iostream>namespace cpp
{int a = 1;int b = 2;int Add(int a, int b){return a + b;}
}
// 将该命名空间进行展开
// using namespace cpp;// 将命名空间域里面的变量或者函数进行个别展开
using cpp::a;
int main()
{// 用命名空间名称 + 作用域作用符// printf("%d\n", cpp::Add(1, 2));// 用using + 命名空间名称,将该命名空间进行展开// using namespace cpp;// 将命名空间域里面的变量或者函数进行个别展开// std::cout << a << std::endl;// 该语句有错误————变量b未定义// std::cout << b << std::endl;return 0;
}

三、C++输入&输出

// 如果是自己做题, 可以将std这个命名空间域进行展开 using namespace std;// 如果是写工程的话,不建议展开
#include <iostream>int main()
{int a = 10;// C++没有占位符(格式输出符 : %d ···)std::cin >> a; // 输入std::cout << a;// 输出return 0;
}

四、缺省参数

说白了就是函数传参的时候,可以进行默认传值(如果没有传值的话)。

缺省参数的初始化的顺序是有要求的,必须是连续的,必须从最右侧开始读入。

#include <iostream>namespace C
{// C语言写法int Add(int a, int b){return a + b;}
}namespace Cpp
{// C++缺省参数写法int Add(int a = 5, int b = 0){return a + b;}// 也可以只缺省一个参数(数目没有要求)int sub(int a, int b = 2){return a * b;}
}int main()
{// endl 的作用是 插入一个换行符,并且刷新输出流std::cout << C::Add(1, 2) << std::endl; std::cout << Cpp::Add(1, 2) << std::endl;std::cout << Cpp::Add(1) << std::endl;std::cout << Cpp::Add() << std::endl;std::cout << Cpp::Add(1) << std::endl;return 0;
}

五、函数重载

函数重载的意义是,允许有多个功能类似的同名函数的存在。(就比如说实现一个加法函数,可以有整型的加法函数,也可以有浮点型的加法函数等等,实现的都是加法的功能,如果要用函数名进行区别的话,比较不友好)

要求:函数的参数类型、参数类型顺序、个数不完全一样。

六、引用

引用:就相当于是给一个变量起了一个别名。

用值作为参数进行传递,形参会形成一份临时拷贝,效率低下。(建议用引用作为形参的类型)

使用注意:

1:用引用的时候,必须进行初始化。

2:引用类型必须和引用实体的类型一样。

3:变量引用完之后不能进行修改。

int a = 10;
int b = 4;
int& c = a;
// 不允许对c进行修改指向的操作
// c = b;

4:一个变量可以多次进行引用。

5:常引用:const int &a=b就相当于 const int * const a=b。不仅仅是a这个地址不可修改,而且其指向的内存空间也不可修改。

引用和指针的区别:

  • 在语法层面,引用不是定义一个新的变量,而是给已有的变量去了一个别名,编译器不会为引用变量开辟空间,引用和引用的变量公用一个空间。
  • 在底层层面,引用的底层也是用指针实现的,也开辟了空间。
  • 指针是新开辟了一个空间,来专门的存变量的地址。
  • 没有空引用,但有空指针。
  • 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
  • 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  • 没有多级引用,有多级指针。
  • 引用不需要自己进行解引用,指针需要。
  • 引用比指针更安全(因为没有野指针,空指针的问题)。

 引用的使用:

1、做参数:见下面代码。
2、做函数返回值:

        1)不能返回局部变量的引用。

        2)不能返回函数内部new分配的内存的引用。

        3)可以返回类成员的引用,但最好是const。

#include <iostream>
using namespace std;// 如果是学C语言的时候,我们写交换函数是传的变量的地址,通过对变量地址的解引用来操作变量的内容。
// 现在我们可以用一个引用类型进行接收,相当于我们还是对原来的变量进行修改(可以从例子看出来,取别名可以是相同的)
void swap(int&a, int &b)
{a = a ^ b;b = a ^ b;a = a ^ b;
}int main()
{int a = 5, b = 6;swap(a, b);cout << a << " " << b;return 0;
}
#include <iostream>
using namespace std;int main()
{int a = 10;int& b = a;b = 3;cout << a;return 0;
}

七、内联函数

1、如果内联函数的代码量比较大的时候,不建议用内联函数,

2、inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。

内联函数其实对标的就是C语言中的宏函数。

如果让你写一个宏函数的话,可能会漏洞百出,比较的麻烦。

// 写一个加法的宏函数// 错误写法一
#define Add(a, b) a + b// 错误写法二
#define Add(a, b) a + b;// 错误写法三
#define Add(a, b) (a + b)// 正确写法
#define Add(a, b) ((a) + (b))

而为了解决这样的问题,C++引入了一个内联函数的语法,和宏函数一样,在编译时,编译器会在调用的地方进行展开。 

#include <iostream>
using namespace std;// 内联函数在函数的基础上加上一个inline的关键字。
inline int Add(int a, int b)
{return a + b;
}int main()
{cout << Add(1, 2);return 0;
}

八、auto关键字(C++11)

使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编 译期会将auto替换为变量实际的类型。

auto不能用来推导数组的类型。

// auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
// 在同一行定义多个变量,当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
int main()
{int x = 10;auto a = &x;auto* b = &x;auto& c = x;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;*a = 20;*b = 30;c = 40;return 0;
}

九、基于范围的for循环(C++11)

#include <iostream>
using namespace std;int main()
{int a[] = {1, 2, 3};for (auto x : a){cout << x << " ";}return 0;
}

十、指针空值---nullptr(C++11)

1、在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。 

2、在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

谢谢大家!

相关文章:

C/C++ C++入门

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C_仍有未知等待探索的博客-CSDN博客 目录 一、C关键字 二、命名空间 1、区别 1. C语言 ​编辑 2. C 2、命名空间定义 3、命名空间的使用 三、C输入&输出 四、缺省参数 五、函数重载 六、引用 …...

【后端】乐观锁和悲观锁

前置知识点 锁&#xff1a;一种确保数据安全的机制和手段。 在多个线程修改共享变量时&#xff0c;我们可以对修改操作进行加锁。当多个用户修改表中的同一数据时&#xff0c;我们可以对该行数据进行加锁&#xff08;行锁&#xff09;。锁是用于控制多个操作在并发环境下按顺…...

软件工程知识梳理1-可行性研究

目的&#xff1a;确定问题是否值得去解决。就是用最小的代价在尽可能短的时间内确定问题是否能够解决。 可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程&#xff0c;也即是在较高层次上以较抽象的方式进行系统分析和设计的过程。 考察点&#xff1a;技术可…...

2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码

2024美国大学生数学建模E题财产保险的可持续模型详解思路具体代码 前言 很快啊&#xff01;啪的一下拿到题目就开始做题&#xff01;简单介绍一下我自己&#xff1a;博主专注建模五年&#xff0c;参与过大大小小数十来次数学建模&#xff0c;理解各类模型原理以及每种模型的建…...

pytorch nearest upsample整数型tensor

在用 torch.nn.Upsample 给分割 label 上采样时报错&#xff1a;RuntimeError: "upsample_nearest2d_out_frame" not implemented for Long。 参考 [1-3]&#xff0c;用 [3] 给出的实现。稍微扩展一下&#xff0c;支持 h、w 用不同的 scale factor&#xff0c;并测试…...

MySQL的SQL MODE

目录 举例&#xff1a; --常见SQL mode --mysql8 sql_mode 官方文档 https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html --查看全局的SQL MODE select global.sql_mode; --查看当前会话的SQL MODE select session.sql_mode; --运行时修改全局的SQL mode set gl…...

GO EASY 框架 之 NET 05

目录 1、Overview 2、Agent接口源码 3、收发消息 4、AgentHandle接收函数 5、conns.Conn接口 1、Overview 名称&#xff1a;agent.Agent 网络链接 接口&#xff1b; DESC&#xff1a;网络链接&#xff0c;服务端与客户端通信媒介&#xff1b; 封装&#xff1a;进一步封…...

【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法

【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法 引言 在应用开发过程中&#xff0c;将应用程序上传到 App Store Connect 是一个关键的环节。本文将探讨几种常见的 IPA 文件上传方法&#xff0c;包括 Xcode、Application Loader、altool、Appuploader以及Transport…...

面试经典 150 题 -- 滑动窗口 (总结)

面试经典150题链接 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 209 . 长度最小的子数组 思路 : 滑动窗口的思想&#xff0c;取ij0,向后遍历j,记录前缀和[l,r]为s,如果s>target,那么左端点向右移动&#xff0c;直到s…...

JDK8对List对象根据属性排序

文章目录 JDK8对List对象根据属性排序1. 被排序字段为null或者空时候报错2. 使用Stream流排序2.1 根据name升序2.2 根据name升序&#xff0c;score降序 3. 使用Collections排序3.1 根据name升序3.2 根据name升序&#xff0c;score降序 4. 完整的demo JDK8对List对象根据属性排序…...

【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!

【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 本人是计算机博士&#xff0c;拥有10年网球球龄&#xff0c;2023年的温网决赛&#xff0c;熬夜到半夜全称观看完了直播&#xff0c;对于网球规则、比赛的数据非常熟悉&#xff0c;这个…...

python的Flask生产环境部署说明照做成功

最近刚好在我的Linux服务器上部署一个Web服务, 使用了python的Flask框架, 因此本文主要介绍flask在linux环境上的部署。 Flask 是一个轻量级的 Python Web 框架&#xff0c;非常适合快速开发小型到中型的 Web 应用。然而&#xff0c;Flask 自带的服务器通常是用于开发目的&…...

EXCEL VBA调用百度api识别身份证

EXCEL VBA调用百度api识别身份证 Sub BC_识别身份证()Dim SHD, SHX As WorksheetDim AppKey, SecretKey, Token, PathY As StringDim jSon, JSonA, WithHttp As ObjectDim Pic, oDom, oW, jsCode, paramsDim ARX, BRX, DRX, ERX, ZADDim StrText, StrUrl As StringDim StrA, S…...

【每日一题】7.LeetCode——合并两个有序链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…...

【零基础学习CAPL】——CAN报文的发送(按下按钮同时周期性发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.CAPL实现4.1.函数展示4.2.全量报文展示5.效果1.概述 本章主要介绍使用CAPL和Panel在按下按钮时发送周期性CAN报文。 本章主要在“【零基础学习CAPL】——CAN报文的发送(配合P…...

六、Nacos源码系列:Nacos健康检查

目录 一、简介 二、健康检查流程 2.1、健康检查 2.2、客户端释放连接事件 2.3、客户端断开连接事件 2.4、小结 2.5、总结图 三、服务剔除 一、简介 Nacos作为注册中心不止提供了服务注册和服务发现的功能&#xff0c;还提供了服务可用性检测的功能&#xff0c;在Nacos…...

2024美赛C题思路/代码:网球中的动量

美赛直播b站&#xff0c;提前关注&#xff1a;川川菜鸟 美赛辅导预定&#xff1a;美赛服务 去年美赛C题&#xff1a;2023美赛C题 题目翻译 背景 在2023年温布尔登男子单打决赛中&#xff0c;20岁的西班牙新星阿尔卡拉兹击败了36岁的诺瓦克德约科维奇。这是德约科维奇自201…...

ConcurrentHashMap原理详解(太细了)

一、什么是ConcurrentHashMap ConcurrentHashMap和HashMap一样&#xff0c;是一个存放键值对的容器。使用hash算法来获取值的地址&#xff0c;因此时间复杂度是O(1)。查询非常快。 同时&#xff0c;ConcurrentHashMap是线程安全的HashMap。专门用于多线程环境。 二、Concurre…...

EasyExcel根据对应的实体类模板完成多个sheet的写入与读取

1.展示模板一的实体类 import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowH…...

在企业数字化转型过程中,IT运维发挥着怎样的价值?

IT运维软件在企业数字化转型中发挥着重要的价值。从效率、稳定性、安全性和资源利用率以及数据分析决策支持都有巨大的提升。 提高效率 利用自动化巡检功能&#xff0c;实时或定时进行系统巡检&#xff0c;减少人力巡检的繁琐和低效&#xff0c;避免手动操作的失误&#xff0c…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...