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。

谢谢大家!

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

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

相关文章

界面控件DevExpress ASP.NET Data Grid组件 - 可快速处理各类型数据!(二)

由DevExpress开发的快速且功能完整的ASP.NET Web Forms的Data Grid组件&#xff0c;从全面的数据塑造和数据过滤选项到十多个集成数据编辑器&#xff0c;该套件提供了帮助用户构建极佳数据所需的一些&#xff0c;没有限制&#xff01;在上文中&#xff08;点击这里回顾>>…

基于Springboot开发的JavaWeb作业查重系统[附源码]

基于Springboot开发的JavaWeb作业查重系统[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &a…

MtfLive直播导航PHP源码,附带系统搭建教程

将自动采集斗鱼、虎牙、触手、YY、章鱼、电视直播按分类/关键词聚合&#xff0c;用户选择分类&#xff0c;可以观看到全网该关键词下正在直播的内容。 特点 PC站和H5移动站自适应 自动缓存&#xff0c;避免频繁抓取数据 自定义抓取采集规则&#xff0c;同时支持HTML和JSON …

Linux网络状态查看与防火墙管理

网络状态查看 netstat [选项] Netstat是一款命令行工具&#xff0c;用于显示Linux系统中网络的状态信息&#xff0c;可以显示网络连接、路由表、连接的数据统计等信息。 使用 选项 -a&#xff1a;显示所有选项&#xff0c;包括监听和未监听的端口。 -t&#xff1a;仅显示tc…

【大厂AI课学习笔记】1.4 算法的进步(2)

关于感知器的兴衰。 MORE&#xff1a; 感知器的兴衰 一、感知器的发明与初期振动 在人工智能的历史长河中&#xff0c;感知器&#xff08;Perceptron&#xff09;无疑是一个里程碑式的存在。它最初由心理学家Frank Rosenblatt在1950年代提出&#xff0c;并在随后的几年中得到…

【MyBatis】MyBatis是什么?作用?怎么实现?

一、MyBatis是什么 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain …

vue2+html2pdf下载PDF,PDF分页切割

问题: PDF下载下来后,文档内容被暴力分割。 解决方案: HTML <!-- 打印按钮 --> <el-button type="primary" size="small" class="el-icon-download right_btn" @click="downloadPDF">PDF</el-button><!-- …

美国的服务器平台盘点 (服务器美国节点哪家好)

一般来说&#xff0c;企业所选服务器的不同是根据业务种类的不同而促成的。对于业务范围主要在国内活动的站长来说&#xff0c;国内服务器足矣;但对于外贸行业来说&#xff0c;想把海外业务扩展起来的话&#xff0c;更适用于使用国外服务器。当前&#xff0c;国外服务器中&…

Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录 CPU数据搜集GPU数据使用光照计算 CPU数据搜集 我们只能支持有限数量的其他灯。并将这些灯光数据&#xff08;位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask&#xff09;发送到GPU以供场景中所有物体渲染使用。 //ForwardLights.cs 额外光源数量与…

The Rise and Potential of Large Language Model Based Agents: A Survey 中文翻译

大型语言模型代理的崛起与潜力&#xff1a;综述 摘要 长期以来&#xff0c;人类一直追求与或超越人类水平的人工智能&#xff08;AI&#xff09;&#xff0c;而人工智能代理被视为实现这一目标的有希望的方式。人工智能代理是感知环境、做出决策并采取行动的人工实体。已经有…

Mysql-ReadView + MVCC-RR 与 RC

实验准备 创建脚本 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,age int(11) NULL DEFAULT NULL,addr varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,PRIMARY …

Wireshark网络协议分析 - UDP协议

在我的博客阅读本文 文章目录 1. 基础2. 实战2.1. 用Go写一个简单的UDP服务器与客户端2.2. Wireshark抓包分析 3. UDP与TCP的区别4. 参考资料 1. 基础 UDP包的数据结构&#xff1a; 2. 实战 2.1. 用Go写一个简单的UDP服务器与客户端 我们这里使用Golang写了一个简单的9830端…

【ArcGIS Pro】从0开始

1.导入excel&#xff0c;需要安装驱动程序 安装用于 Microsoft Excel 文件的驱动程序 https://pro.arcgis.com/zh-cn/pro-app/latest/help/data/excel/prepare-to-work-with-excel-in-arcgis-pro.htm 2.修改投影坐标系 点到地图图标上&#xff0c;右键才能设置坐标系。 3.…

python爬虫3

1.异常处理&#xff0c;使代码更加健壮 静态cookie可视绕过登录的限制 快代理是一个代理平台 # https://movie.douban.com/j/chart/top_list?type5&interval_id100%3A90&action& # start0&limit20# https://movie.douban.com/j/chart/top_list?type5&int…

「解决方案架构」“解决方案架构”日常思维

作为一名架构师&#xff0c;你可以期望&#xff0c;在你职业生涯的某个时刻&#xff0c;参与一个关键的前线&#xff0c;动荡的项目或计划。在这种情况下&#xff0c;你需要依靠在信息和通信技术领域工作几年所获得的技术、政治和社会技能。 今天的博客&#xff08;在伦敦考文垂…

什么可以用手机蓝牙控制LED???#串口通信【下】

什么可以用手机蓝牙控制LED&#xff1f;&#xff1f;&#xff1f;#串口通信【下】 前言预备知识1.小白玩串口控制的ASSII避坑1.1问题引入1.2解决问题 2.串口支持单词型指令控制2.1实现串口支持单词型指令控制的核心思路2.2利用字符数组来承接单词型指令2.3利用strstr函数来查找…

MIT6.5830 实验0

前置 本次实验使用 Golang 语言实现&#xff0c;在之前的年份中&#xff0c;都是像 cs186 那样使用 Java 实现。原因&#xff1a; Golang 语言作为现代化语言&#xff0c;简单易上手但功能强大。 使参加实验的同学有同一起跑线&#xff0c;而不是像Java那样&#xff0c;有些同…

LeetCode.189. 轮转数组

题目 题目链接 分析 首先能想到的就是可以用一个新数组&#xff0c;先保存原数组的后 k 个元素&#xff0c;再保存原数组的前 n−k 个元素。但题目要求不使用额外的数组空间&#xff0c;那么就需要在原数组上做操作。 我们可以先把整个数组翻转一下&#xff0c;这样后半段元…

CANoe学习笔记——窗口类型

CANoe中的窗口类型&#xff0c;共分为三种 1&#xff1a;MDI windows 2&#xff1a;Standard Windows 3&#xff1a;Docking Windows 窗口有多种类型&#xff0c;每种类型都定义了特定的窗口行为。通过点击窗口顶部的区域&#xff0c;可以更改窗口类型。 如下图&#xff0…

QT自制软键盘 最完美、最简单、支持中文输入(二)

目录 一、前言 二、本自制虚拟键盘特点 三、中文输入原理 四、组合键输入 五、键盘事件模拟 六、界面 七、代码 7.1 frmKeyBoard 头文件代码 7.2 frmKeyBoard 源文件代码 八、使用示例 九、效果 十、结语 一、前言 由于系统自带虚拟键盘不一定好用&#xff0c;也不一…