【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++入门的杂碎知识点
思维导图大纲: namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域,它可以将内部的成员隔绝起来。举个例子,我们都知道有全局变量和局部变量,全局变量存在于全局域…...
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...
散列函数的基本概念
散列函数 算法不能设计太过复杂 太复杂的散列函数,势必会消耗很多计算时间 散列函数生成的值要尽可能随机并且均匀分布 这样才能避免或者最小化散列冲突而且即便出现来冲突,散列到每个槽里的数据也会比较平均,不会出现某个槽内数据特别多…...
【C++拷贝构造函数深浅拷贝】
拷贝构造函数 注意:访问权限是public 拷贝构造函数:类名(const 类名& 对象名){} 可以有多个参数 。 没有常引用就是普通构造函数 如果不写,编译器自己会给一个(作用仅仅是赋值,默认拷…...
快速编译安装tensorrt_yolo
快速编译安装 安装 tensorrt_yolo 通过 PyPI 安装 tensorrt_yolo 模块,您只需执行以下命令即可: pip install -U tensorrt_yolo 如果您希望获取最新的开发版本或者为项目做出贡献,可以按照以下步骤从 GitHub 克隆代码库并安装: …...
外盘黄金期货需要注意什么?
为大家整理了关于黄金做单的五大原则,相信对于新手投资者来说肯定会产生一定的帮助。 1、看多空:主要有两种方法,基本面判断和技术面判断,基本面判断,主要是借助基本信息面,如政策。供需,产量…...
Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包
Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包 一、Gerber文件层叠与参数设置二、装配图文件设置导出三、光绘参数设置四、Gerber孔符图、钻孔表及钻孔文件输出五、输出Gerber文件六、输出IPC网表七、导出坐标文件八、文件打包 一、Gerber文件层叠与参数设置…...
mysql的索引可以分为哪些类型
MySQL的索引是用于提高查询性能的重要数据结构。不同类型的索引在不同的使用场景中具有不同的优势和适用性。 1. 主键索引(Primary Key Index) 特点:唯一且不允许 NULL 值。用途:唯一标识表中的每一行。自动创建:定义…...
Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported
Content type application/x-www-form-urlencoded;charsetUTF-8 not supported 问题背景新增页面代码改造 问题背景 这里有一个需求,前端页面需要往后端传参,参数包括主表数据字段以及子表数据字段,由于主表与子表为一对多关系,在…...
【JavaEE进阶】——利用框架完成功能全面的图书管理系统
目录 🚩项目所需要的技术栈 🚩项目准备工作 🎈环境准备 🎈数据库准备 🚩前后端交互分析 🎈登录 📝前后端交互 📝实现服务器代码 📝测试前后端代码是否正确 &am…...
WDF驱动开发-内存缓冲区
驱动程序通常使用内存缓冲区向/从框架和其他驱动程序传递数据,或在本地存储信息。 WDF常见的内存缓冲区包括框架内存对象(WDFMEMORY)、 lookaside、 MDL 和 本地缓冲区。 使用框架内存对象 框架使用 内存对象 来描述驱动程序从中接收并传递给框架的内存缓冲区。 每…...
c语言连接两个字符串
在C语言中,连接两个字符串可以使用 strcat 函数。这个函数将一个字符串复制到另一个字符串的末尾。使用 strcat 函数之前,需要确保目标字符串有足够的空间来容纳源字符串,否则可能会导致缓冲区溢出。 下面是一个使用 strcat 函数连接两个字符…...
基于springboot的大学计算机基础网络教学系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的大学计算机基础网络教学…...
UOS常用命令
shutdown 关机 reboot 重启 reboot -f 强制重启 history 查看使用的历史命令 history -c 清空命令行常见目录结构 /bin 存储常用用户指令 /boot 存放用于系统引导时使用的各种文件 /dev 存放设备文件 /etc 存放系统,服务的配置…...
vue3 如何给表单添加表单效验+正则表达式
校验要求 我们的表单中有密码、电话号码 ,两项。 我们设置用密码为3到20位的非空字符 电话号码就用目前用的电话号码正则表达式,要求手机号码以 1 开头,第二位为 3 到 9 之间的数字,后面跟着任意 9 个数字,总共是 11…...
JavaScript算法实现dfs查找省市区路径
需求 存在如下数组,实现一个算法通过输入区名,返回省->市->区格式的路径,例如输入西湖区,返回浙江省->杭州市->西湖区。 // 定义省市区的嵌套数组 const data [{name: "浙江省",children: [{name: "…...
map文件分析
以下是一个具体的map文件示例,并附上详细的描述,帮助你更好地理解如何读取和分析map文件: 示例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-插入数据 语法格式: insert into 表名(字段名1, 字段名2, 字段名3,......) values (值1,值2,值3,......);insert into t_user(no, name, gender) values(1, Cupid, 男);字…...
【鸿蒙 HarmonyOS】Swiper组件
一、背景 项目中通常会遇到图片轮播,内容轮播的场景;如:在一些应用首页显示推荐的内容时,需要用到轮播显示的能力。 二、源码地址 ✍Gitee开源项目地址👉:https://gitee.com/cheinlu/harmony-os-next-swi…...
玩具机器人脚本适合场景
玩具机器人脚本作为一个模拟的玩具机器人脚本,适合以下场合: 1.教育和学习:对于初学者和编程爱好者来说,这个脚本是一个很好的学习工具,可以帮助他们理解如何编写和执行简单的控制逻辑。 2.在计算机科学、机器人技术或…...
人工智能模型组合学习的理论和实验实践
组合学习,即掌握将基本概念结合起来构建更复杂概念的能力,对人类认知至关重要,特别是在人类语言理解和视觉感知方面。这一概念与在未观察到的情况下推广的能力紧密相关。尽管它在智能中扮演着核心角色,但缺乏系统化的理论及实验研…...
MySQL备份与恢复:确保数据的安全与可靠性
引言: 数据的安全性和可靠性的重要性 在现代企业和组织中,数据已经成为了最重要的资产之一。数据的安全性和可靠性对于企业的运营至关重要。首先,数据的安全性保证了敏感信息不会落入错误的手中,防止了潜在的经济损失和法律风险。其次,数据的可靠性则确保了企业能够准确…...
Noisee AI – AI音乐影片MV在线生成工具,专门为Suno的好搭子来了~
导读 现在很多各大平台,抖音、快手、微视,还不能直接发布音频文件,如果有一个好听的音乐想做成MV,怎么办呢? 这时候就是Noisee AI的主场,上传一段音乐加上简单的描述就可以在3-5分钟内生成一个可以发布到…...
实战计算机网络02——物理层
实战计算机网络02——物理层 1、物理层实现的功能2、数据与信号2.1 数据通信模型2.2 通信领域常用术语2.3 模拟信号和数字信号 3、信道和调制3.1 信道3.2 单工通信、半双工通信、全双工通信3.3 调制3.4 奈式准则3.5 香农定律 4、传输媒体4.1 导向传输媒体4.2 非导向传输媒体 5、…...
Doris:冷热分层
目录 一、冷热分层介绍 二、存储策略(Storage policy) 2.1 创建存储资源 2.2 创建存储策略 2.3 使用存储策略 三、使用限制 一、冷热分层介绍 冷热分层支持所有 Doris 功能,只是把部分数据放到对象存储上,以节省成本&am…...
28.启动与暂停程序
上一个内容:27.设计注入功能界面 以它 27.设计注入功能界面 的代码为基础进行修改 点击添加游戏按钮之后就把游戏启动了 CWndINJ.cpp文件中修改: void CWndINJ::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码/*ExeLst.InsertItem(0, L…...
404 页面代码
<template> <div class"container"><h1>404</h1> <div ><p class"text-center">当前页面无法访问,可能没有权限或已删除</p><p class"text-center"> 去别处看看吧</p> </div> <…...
java设计模式和面向对象编程思想
Java设计模式和面向对象编程思想是软件开发中的核心概念,对于构建可维护、可扩展的软件系统至关重要。下面是对这两个主题的知识点总结: 面向对象编程(OOP)思想 封装:将数据(属性)和操作这些数据…...
超万卡训练集群网络互联技术解读
超万卡训练集群互联关键技术 大模型迈向万亿参数的多模态升级,万卡集群计算能力亟需飞跃。关键在于增强单芯片性能、提升超节点算力、融合DPU多计算能力,并追求算力能效比极致。这一系列提升将强有力支撑更大规模模型训练和推理,快速响应业务…...
做个网站上百度怎么做/相亲网站排名前十名
代码 在Delphi 开发中,常常应用到窗体消息传递,以达成某种操作要求,以下列举一个应用的例子,供大家参考。 自定义过程/函数方法://发送字符串到指字句柄的窗口中 (接收窗体需用发送时的消息常量WM_COPYDATA)procedureS…...
广东城乡建设厅网站首页/怎么看百度关键词的搜索量
本人用VBMO开发近两年,中间积累了一些小经验,对老手可能没用,但对新手可能有一点帮助。下面把它记下来,也算是一个小小的总结。很多东西没想起来,下次更新时补上。 大部分内容只是概述了实现的思路,具体实现…...
wordpress前台不显示图片/网上引流推广怎么做
网上关于JAVA的适配器模式例子有很多,但真的有少实在不怎么样,看也不懂。自己总结了一个在性能和结构上都很容易理解的Adapter模式。 Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter模式是构造型模式之一,通…...
asp网站开发上传组建/电商推广
http://www.runoob.com/sqlite/sqlite-select.html SQLite Select 语句 SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。 语法 SQLite 的 SELECT 语句的基本语法如下: SELECT column1, colu…...
浅谈电子商务网站建设与管理/360免费建站教程
今天在整理硬盘时发现数月前下载的柯南剧场版《沉默的十五分钟》,看过了觉得并不好看,决定把它删除时出现了如下错误:错误 0x80070570: 文件或目录损坏且无法读取。不要太担心是出现了磁盘坏道,也许只是小小的存储问题…...
网站开发报价单模板/谷歌搜索为什么用不了
9.1 类(class) 面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板以Student类为例,在Python中,定义类是通过class关键字class后面紧接着是类名&#x…...