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

【C++】C++入门的杂碎知识点

思维导图大纲:

 namespac命名空间

  •  什么是namespace命名空间
  • namespace命名空间有什么用

什么是命名空间 

namespace命名空间是一种域,它可以将内部的成员隔绝起来。举个例子,我们都知道有全局变量和局部变量,全局变量存在于全局域中,局部变量存在于局部域中,看下段代码 ,根据已经学习的知识我们都知道局部优先,所以输出会打印局部变量的数据。

#include <stdio.h>// 全局域
int a = 10;int main()
{// 局部域int a = 0;printf("%d", a);
}

由上述代码可以知道,不同的域可以存在相同名称的变量,而输出函数会优先在最近的域中寻找变量a,如果找不到才去全局找。那么有没有一种办法可以绕过局部域,打印全局域的变量a呢,答案是声明我们要打印的变量来源。 

#include <stdio.h>// 全局域
int a = 10;int main()
{// 局部域int a = 0;printf("%d\n", a);// 在变量名称前加上:: 这样编译器就知道到全局域中寻找了printf("%d\n", ::a);
}

通过以上我们大概了解了域方面的知识,那么什么是namespac命名空间呢,简单的说就是一个我们可以自定义的域,在这个域中我们可以存放函数/变量等等,同时因为具有域的特性,我们在多人合作项目时,可以各种取一个命名空间,这样我们可以使用相同命名的函数或者变量了 。

namespace关键字,后面的ouyang1可以任意取名: 

#include <stdio.h>// 命名空间
namespace ouyang1
{int a = 15;
}namespace ouyang2
{int a = 20;
}int main()
{printf("%d\n", ouyang1::a);printf("%d\n", ouyang2::a);
}

当然在你需要使用什么内部成员时声明一下就可以了 ,以下时使用不同成员声明的代码表述。

namespace ouyang
{// 变量int a = 10;// 函数int add(int x, int y){return x + y;}// 结构体struct student_name{char name[20];};// 枚举enum{red = 1,blue,yellow};}int main()
{printf("%d\n", ouyang::a);printf("%d\n", ouyang::add(1, 3));struct ouyang::student_name s1;printf("%d\n", ouyang::red);printf("%d\n", ouyang::blue);printf("%d\n", ouyang::yellow);}

 命名空间的作用:

命名空间可以防止命名冲突的发生,同时每一个命名空间都相当于一个域,访问需要声明获得权限,简单说就相当于我们所划定的领域,这样的设计可以使我们在团队项目中避免冲突发生。

命名空间的展开: 

那么我们每次去使用命名空间时,都需要在前声明会不会有点麻烦,为了解决这一问题,c++语法中还包含了命名空间的展开,展开代码如下:

// 命名空间
namespace ouyang
{int a = 10;
}
// 命名空间的展开
using namespace ouyang;

展开命名空间,就相当于对编译器开放了该命名空间的访问权限,但是注意域的访问顺序还是存在先后的,首先编译器还是会到局部域中去寻找,其次才是全局域和命名空间域。 

这种展开有好也有坏,好处是:我们可以随意访问命名空间内的成员,坏的一方面如果命名空间展开的成员过多,不可避免会产生命名冲突问题,如以下代码:

// 命名空间
namespace ouyang
{int a = 10;
}
// 命名空间的展开
using namespace ouyang;int a = 0;int main()
{printf("%d", a);return 0;
}

 由于展开命名空间后,编译器访问全局域和命名空间域的优先程度一致,所以编译器无法区分究竟因该访问哪一个。

命名空间的局部展开: 

为了防止展开太多出现以上情况,c++语法中又提出了局部展开,就是展开到特定的成员,这样可以大大降低了命名冲突带来的报错,也方便快速查找问题。 

局部展开代码展示: 

// 命名空间
namespace ouyang
{int a = 10;int b = 5;
}
// 命名空间的局部展开
using ouyang::b;int main()
{printf("%d", b);return 0;
}

 有了局部展开后,我们以后想访问命名空间的谁再去展开,这样既可以优化代码的冗长度,又可以很好的控制使用。

C++的输入输出

  • cout
  • cin
  • endl

前提:我们都知道c语言中使用输入输出函数scanf/printf需要包括头文件#include<stdio.h>,同样c++语法中使用以上的函数也需要包含头文件#include <iostream>。 

cout输出符 

上一个知识点我们了解了命名空间,c++在使用头文件时,为了避免命名冲突,也给其中的成员创建了命名空间域用于保护,如我们要使用的输入输出等等的函数都包含着命名空间std中。 

注意:c++是在c语言的基础上衍生的,所以可以适用c语言的语法 

代码使用方式: 

#include <stdio.h>
#include <iostream>
using namespace std;int main()
{// 变量int a = 10;double b = 13.14;char c = 'a';// c语言的输入输出printf("C语言:");printf("%d %lf %c\n", a, b, c);// c++语言的输入输出// << 这个符号叫做流插入 / << 还有另外的一层意思就是左位移操作符// cout会自动识别类型输出cout << "C++:   ";cout << a << " " << b << " " << c << '\n';
}

 cin输入符

 cin输入符可以制动识别输入的数据类型存放到相应的变量之中。

代码演示: 

int main()
{// 变量int a = 0;double b = 0;char c = 0;// 流提取cin >> a >> b >> c;cout << a << " " << b << " " << c <<endl;
}

注:endl符相当于换行 

 函数重载:

定义:在同一个域中,可以存在相同命名的函数,但是这些函数需要满足以下条件之一:

  • 1.参数的类型不同
  • 2.参数的个数不同
  • 3.参数的顺序不同

 代码演示:

// 函数重载// 全局域中,交换函数Swap
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}void Swap(double* a, double* b)
{double tmp = *a;*a = *b;*b = tmp;
}
int main()
{int num1 = 1, num2 = 2;double num3 = 1.1, num4 = 2.2;cout << "交换前:" << endl;cout << num1 << " " << num2 << " " << num3 << " " << num4 << endl;// 交换Swap(&num1, &num2);Swap(&num3, &num4);cout << "交换后:" << endl;cout << num1 << " " << num2 << " " << num3 << " " << num4 << endl;return 0;
}

 以上是函数重载中的参数类型不同,以下还有参数数量不同,参数顺序不同:

// 参数数量不同void print(int a, double b, char c)
{cout << "print(int a, double b, char c)" << endl;
}void print(int a, double b)
{cout << "print(int a, double b)" << endl;
}int main()
{print(1, 1.1, 'a');print(1, 1.1);return 0;
}

// 函数重载
// 参数顺序不同
void swap(int* a, double* b)
{cout << "swap(int* a, double* b)" << endl;
}void swap(double* a, int* b)
{cout << "swap(double* a, int* b)" << endl;
}
int main()
{int num1 = 1;double num2 = 1.1;swap(&num1, &num2);swap(&num2, &num1);return 0;
}

引用 

引用符号->& 

引用的定义:引用相当于给变量取一个别名,就像张三,我们平日可能会叫他老张,张三,也可能会叫小张,但这些所有的称呼都指向一个人张三,引用的作用就是这样: 

// 引用
int main()
{int a = 0;int& b = a;b++;cout << "a=" << a << " " << "b=" << b << endl;return 0;
}

以上代码我们可以看见,我们给变量a取了一个别名b,我们在使用b++的时候就相当于a++,所有最后的结果a=1。

 权限放大和权限缩小问题

我们在给变量取别名的时候,可以通过别名对变量进行修改,但如果我们的变量由const修饰之后怎么办呢,这就涉及到权限放大和权限缩小问题

1. 权限可以缩小,不可以放大

int main()
{// 权限放大不被允许const int a = 10;// int& b = a; // err// 权限缩小允许int a = 10;const int& b = a;
}

2. 拥有常量属性的变量权限不可以放大。

如以下代码:

int main()
{int x = 1, y = 2;// int& c = x + y; // x+y这种临时变量具有常性 // errconst int& c = x + y;return 0;
}

应用场景 

  • 做参数
  • 做返回值 

做参数可以在交换函数中替代指针的适用。

void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}int main()
{int a = 1, b = 2;cout << a << " " << b << endl;Swap(a, b);cout << a << " " << b << endl;
}

 做返回值可以用于接收结果。

int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int ret = Add(1, 2);Add(3, 4);cout << "Add(1, 2) is :" << ret << endl;return 0;
}

引用和指针的区别 

  • 1. 引用在语法上不开空间,底层和指针一样需要开空间,但是我们应用层面默认为不开空间
  • 2. 引用必须初始化,而指针可以不用,或者指向空
  • 3.引用在初始化一个实体后,不能在改成别的实体,但是指针可以改变指向
  • 4.引用自加是实体加1,而指针加1,是指向的类型位置+1
  • 5.有多级指针,没有多级引用
  • 6.指针的大小由sizeof计算是固定的,区别是64位机器还是32位机器,但是引用的大小与引用的实体相关,比如说:引用的类型int,大小4字节;引用的类型double,大小8字节
  • 7.引用比指针安全
  • 8.访问方式上,指针需要解引用,但是引用不需要,编译器会自己处理 

缺省参数 

我们往往有时候在使用函数时会忘记传入参数,那么有没有一种办法在我们没有传参的情况下,函数可以使用默认的值进行传入使用呢?这就是缺省参数

// 全缺省
// 传值按传值来,不传值按默认来
void print1(int a = 1, int b = 1, int c = 1)
{cout << a << " " << b << " " << c << endl;
}// 半缺省 -> 没有缺省的参数必须传值
void print2(int a, int b = 1, int c = 1)
{cout << a << " " << b << " " << c << endl;
}int main()
{print1();print1(10);print1(10, 20);print1(10, 20, 30);print2(10);print1(10, 20);print1(10, 20, 30);return 0;
}

注意: 缺省只能从右往左缺省,缺省参数不可以跳跃传参!

不允许)跳跃传参的演示如下: 

// 传值按传值来,不传值按默认来
void print1(int a = 1, int b = 1, int c = 1)
{cout << a << " " << b << " " << c << endl;
}int main()
{print1(, 10, );// errreturn 0;
}

 内联函数

定义:和c语言中的宏类似,被修饰的函数不会去使用地址调用,只会在原地展开,这种内联函数只适用于代码量少,简单的函数,并且原地展开的请求只是对编译器的建议,如果函数过大,编译器可以默认不执行展开改为调用,同时由于是原地展开,内联函数无法声明与定义分离,会在链接时报错找不到函数的地址。 

// 内联函数
inline int add(int x, int y)
{return x + y;
}int main()
{int ret = add(1, 2);cout << ret << endl;return 0;
}

auto关键字 

定义:自动识别变量类型

使用方式如下:

// auto 关键字
int main()
{auto a = 10;auto b = 13.14;auto c = 'a';cout << a << " " << b << " " << c << endl;return 0;
}

 

打印类型的函数typeid(变量名).name() 

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

代码展示如下:

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };for (auto x : arr){cout << x << " ";}// 如果要改变arr中的值,使用&for (auto& x : arr){x *= 2;}cout << endl;for (auto x : arr){cout << x << " ";}
}

 空指针nullptr

在c语言中我们已经了解了空指针NULL,但是在c++语法中实现时,却存在一个坑,c++语法中的NULL 定义为0 ,而不是(void*)0 ,就会导致以下代码情况。

void pint(int)
{cout << "void pint(int)" << endl;
}void pint(int*)
{cout << "void pint(int*)" << endl;
}int main()
{int i = 0;pint(i);pint(NULL);pint(nullptr);
}

 注意:

  • 1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  •  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  • 3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

 

 

 

 

 

 

 

 

相关文章:

【C++】C++入门的杂碎知识点

思维导图大纲&#xff1a; namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域&#xff0c;它可以将内部的成员隔绝起来。举个例子&#xff0c;我们都知道有全局变量和局部变量&#xff0c;全局变量存在于全局域…...

springboot 整合redis问题,缓存击穿,穿透,雪崩,分布式锁

boot整合redis 压力测试出现失败 解决方案 排除lettuce 使用jedis <!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclus…...

免费个人站 独立站 wordpress 自建网站

制作免费网站 | 免费网站构建器 | WordPress.com https://bioinformatics7.wordpress.com WordPress.com...

散列函数的基本概念

散列函数 算法不能设计太过复杂 太复杂的散列函数&#xff0c;势必会消耗很多计算时间 散列函数生成的值要尽可能随机并且均匀分布 这样才能避免或者最小化散列冲突而且即便出现来冲突&#xff0c;散列到每个槽里的数据也会比较平均&#xff0c;不会出现某个槽内数据特别多…...

【C++拷贝构造函数深浅拷贝】

拷贝构造函数 注意&#xff1a;访问权限是public 拷贝构造函数&#xff1a;类名&#xff08;const 类名& 对象名&#xff09;{} 可以有多个参数 。 没有常引用就是普通构造函数 如果不写&#xff0c;编译器自己会给一个&#xff08;作用仅仅是赋值&#xff0c;默认拷…...

快速编译安装tensorrt_yolo

快速编译安装 安装 tensorrt_yolo 通过 PyPI 安装 tensorrt_yolo 模块&#xff0c;您只需执行以下命令即可&#xff1a; pip install -U tensorrt_yolo 如果您希望获取最新的开发版本或者为项目做出贡献&#xff0c;可以按照以下步骤从 GitHub 克隆代码库并安装&#xff1a; …...

外盘黄金期货需要注意什么?

为大家整理了关于黄金做单的五大原则&#xff0c;相信对于新手投资者来说肯定会产生一定的帮助。  1、看多空&#xff1a;主要有两种方法&#xff0c;基本面判断和技术面判断&#xff0c;基本面判断&#xff0c;主要是借助基本信息面&#xff0c;如政策。供需&#xff0c;产量…...

Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包

Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包 一、Gerber文件层叠与参数设置二、装配图文件设置导出三、光绘参数设置四、Gerber孔符图、钻孔表及钻孔文件输出五、输出Gerber文件六、输出IPC网表七、导出坐标文件八、文件打包 一、Gerber文件层叠与参数设置…...

mysql的索引可以分为哪些类型

MySQL的索引是用于提高查询性能的重要数据结构。不同类型的索引在不同的使用场景中具有不同的优势和适用性。 1. 主键索引&#xff08;Primary Key Index&#xff09; 特点&#xff1a;唯一且不允许 NULL 值。用途&#xff1a;唯一标识表中的每一行。自动创建&#xff1a;定义…...

Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported

Content type application/x-www-form-urlencoded;charsetUTF-8 not supported 问题背景新增页面代码改造 问题背景 这里有一个需求&#xff0c;前端页面需要往后端传参&#xff0c;参数包括主表数据字段以及子表数据字段&#xff0c;由于主表与子表为一对多关系&#xff0c;在…...

【JavaEE进阶】——利用框架完成功能全面的图书管理系统

目录 &#x1f6a9;项目所需要的技术栈 &#x1f6a9;项目准备工作 &#x1f388;环境准备 &#x1f388;数据库准备 &#x1f6a9;前后端交互分析 &#x1f388;登录 &#x1f4dd;前后端交互 &#x1f4dd;实现服务器代码 &#x1f4dd;测试前后端代码是否正确 &am…...

WDF驱动开发-内存缓冲区

驱动程序通常使用内存缓冲区向/从框架和其他驱动程序传递数据&#xff0c;或在本地存储信息。 WDF常见的内存缓冲区包括框架内存对象(WDFMEMORY)、 lookaside、 MDL 和 本地缓冲区。 使用框架内存对象 框架使用 内存对象 来描述驱动程序从中接收并传递给框架的内存缓冲区。 每…...

c语言连接两个字符串

在C语言中&#xff0c;连接两个字符串可以使用 strcat 函数。这个函数将一个字符串复制到另一个字符串的末尾。使用 strcat 函数之前&#xff0c;需要确保目标字符串有足够的空间来容纳源字符串&#xff0c;否则可能会导致缓冲区溢出。 下面是一个使用 strcat 函数连接两个字符…...

基于springboot的大学计算机基础网络教学系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的大学计算机基础网络教学…...

UOS常用命令

shutdown 关机 reboot 重启 reboot -f 强制重启 history 查看使用的历史命令 history -c 清空命令行常见目录结构 /bin 存储常用用户指令 /boot 存放用于系统引导时使用的各种文件 /dev 存放设备文件 /etc 存放系统&#xff0c;服务的配置…...

vue3 如何给表单添加表单效验+正则表达式

校验要求 我们的表单中有密码、电话号码 &#xff0c;两项。 我们设置用密码为3到20位的非空字符 电话号码就用目前用的电话号码正则表达式&#xff0c;要求手机号码以 1 开头&#xff0c;第二位为 3 到 9 之间的数字&#xff0c;后面跟着任意 9 个数字&#xff0c;总共是 11…...

JavaScript算法实现dfs查找省市区路径

需求 存在如下数组&#xff0c;实现一个算法通过输入区名&#xff0c;返回省->市->区格式的路径&#xff0c;例如输入西湖区&#xff0c;返回浙江省->杭州市->西湖区。 // 定义省市区的嵌套数组 const data [{name: "浙江省",children: [{name: "…...

map文件分析

以下是一个具体的map文件示例&#xff0c;并附上详细的描述&#xff0c;帮助你更好地理解如何读取和分析map文件&#xff1a; 示例map文件 Memory ConfigurationName Origin Length Attributes FLASH 0x08000000 0x0…...

MySQL-创建表~数据类型

070-创建表 create table t_user(no int,name varchar(20),gender char(1) default 男);071-插入数据 语法格式&#xff1a; insert into 表名(字段名1, 字段名2, 字段名3,......) values (值1,值2,值3,......);insert into t_user(no, name, gender) values(1, Cupid, 男);字…...

【鸿蒙 HarmonyOS】Swiper组件

一、背景 项目中通常会遇到图片轮播&#xff0c;内容轮播的场景&#xff1b;如&#xff1a;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 二、源码地址 ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/harmony-os-next-swi…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...