C++核心语法入门:从命名空间到nullptr的全面解析

C++核心语法入门:从命名空间到nullptr的全面解析

前言:终于到了C++章节,已经有点迫不及待了。今天我们来学习C++入门小知识。

1. 命名空间

1.1 namespace的价值

在C/C++中变量,函数名以及后面学习的类都是大量存在的,这些变量,函数名和类的名称都存在于全局作用域中,可能会导致很多冲突使用命名空间的目的就是为了解决命名冲突的问题。namespace是一个关键字

#include<stdio.h>#include<stdlib.h>int rand =20;intmain(){//重定义,rand是一个函数,包含在stdlib.h里printf("%d\n", rand);return0;}


我们本意是想要打印整型变量的,但在C++里不同,编译器会在局部域先进行查找,找不到再去全局域查找此时全局域有两个rand,一个是rand函数,一个是rand整型变量,这时就会发生报错。

1.2 namespace的定义

.定义命名空间,需要使用namespace关键字后面跟命名空间的名字,然后接一对{}即可。{}中即为命名空间的成员。命名空间中可以定义变量,函数,类型等

//解决了命名冲突的问题 namespace LC {int rand =20;structNode{int val;structNode* next;};}intmain(){//这里默认访问的是全局域里的rand函数指针printf("%p\n", rand);//指定了rand的出处,就会直接在LC命名空间里去查找printf("%d\n", LC::rand);return0;}

.namespace本质上是定义出了一个域,这个域跟全局域各自独立,不同的域可以定义同名变量

.C++中有局部域,全局域,命名空间域,类域域影响的是编译器语法查找变量/函数/类型出处的逻辑,所以有了域隔离,名字冲突的问题就解决了局部域和全局域除了会影响编译器的查找逻辑,还会影响变量的生命周期,命名空间域和类域不会影响变量的生命周期

.namespace只能定义在全局,也可以嵌套定义

intmain(){//命名空间不能定义在局部域 namespace LC {int a =10;intAdd(int left,int right){return left + right;}}return0;}
在这里插入图片描述

.项目工程中多文件中定义的同名namespace会认为是同一个namespace,不会发生冲突

.C++标准库都放在一个叫std(standard)的命名空间中

//命名空间的嵌套定义 namespace LC { namespace NSY {int rand =100;doubleAdd(double left,double right){return left + right;}}int a =10;intAdd(int left,int right){return left + right;}}intmain(){printf("%d\n", LC::a);printf("%d\n", LC::NSY::rand);printf("%d\n", LC::Add(2,4));printf("%.2f\n", LC::NSY::Add(2.2,4.4));return0;}

1.3 命名空间的使用

编译器在查找一个变量的声明或者定义时默认只会在局部域和全局域查找,不会到命名空间域里去查找

namespace LC {int a =10;intAdd(int left,int right){return left + right;}}intmain(){printf("%d\n", a);return0;}
在这里插入图片描述

所以,我们要使用命名空间里定义的变量和函数,有以下几种方式:

1.指定命名空间访问

2.using将命名空间中的某个成员展开

3.展开命名空间中全部成员

namespace LC {int a =10;double b =3.14;char ch ='a';}//展开命名空间部分成员 using LC::b;//展开命名空间全部成员 using namespace LC;intmain(){//指定命名空间访问printf("%d\n", LC::a);printf("%.2f\n", b);printf("%c\n", ch);return0;}

2. C++输入&输出

 1.<iostream>是Input Output Stream的缩写,是标准的输入,输出流 库,定义了标准的输入,输出对象。 2.std::cin是istream类的对象,它主要面向窄字符(narrow characters(of type char))的标准输入流。 3.std::cout是ostream类的对象,它主要面向窄字符的标准输出流。 4.std::endl是一个函数,流插入输出时,相当于一个换行字符加刷新缓冲区。 5.<<(流插入运算符),>>(流提取运算符),C语言中这两个运算符是位运算符。 6.C++的输入输出可以自动识别变量类型(本质上是通过函数重载实 现的),最重要的是C++的流能更好的支持自定义类型对象的输入输 出。 7.cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std (standard)的命名空间中,所以要通过命名空间的使用方式去用它 们。 8.using namespace std是将标准命名空间全部成员展开(一般在日常练习中使用) 
#include<iostream>intmain(){int a =10;double b =3.14;char ch ='c';//cout,cin是标准输入输出流的对象,属于C++标准库//不需要像C语言使用占位符来指定打印格式,cout,cin会自动识别类型 std::cout << a <<" "<< b <<" "<< ch << std::endl; std::cin >> a >> b >> ch; std::cout << a <<" "<< b <<" "<< ch << std::endl;return0;}
在这里插入图片描述
#include<iostream>//将std(标准命名空间)全部成员展开 using namespace std;intmain(){int a =10;double b =3.14;char ch ='c';//不需要在指定std cout << a <<" "<< b <<" "<< ch << endl; cin >> a >> b >> ch; cout << a <<" "<< b <<" "<< ch << endl;return0;}

3. 缺省参数

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

.在调用函数时,如果没有指定实参,则采用形参的缺省值,否则,使用指定的实参

在这里插入图片描述

.缺省参数分为全缺省和半缺省参数。(缺省参数也可以叫做默认参数)全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C++规定,半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值

在这里插入图片描述

.带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参

在这里插入图片描述


在这里插入图片描述

.函数声明和定义分离时缺省参数不能在函数声明和函数定义中同时出现,C++规定,必须在函数声明的地方给缺省值

在这里插入图片描述


在这里插入图片描述

4. 函数重载

定义:C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数不同也可以是类型不同

.形参类型不同

在这里插入图片描述

.形参个数不同

在这里插入图片描述

.存在歧义问题

在这里插入图片描述


在这里插入图片描述

5. 引用

5.1 引用的概念和定义

概念引用不是新定义一个变量,而是对已存在的变量取别名编译器不会对引用变量开辟内存空间它和它引用的变量共用同一块空间

定义类型& 引用别名 = 引用对象

在这里插入图片描述


在这里插入图片描述

5.2 引用的特性

.引用在定义时必须初始化

在这里插入图片描述


在这里插入图片描述

.引用一旦引用一个实体以后就不能在引用其它实体

在这里插入图片描述

.一个变量可以有多个引用

在这里插入图片描述

5.3 引用的使用

引用在实践中主要用于引用传参和引用作返回值,可以减少拷贝提高效率,改变引用对象的同时可以改变被引用对象

在这里插入图片描述

这里传参只是传递了一个整型,拷贝并不会损失多少效率,但是如果是一个大对象呢?例如C中的结构体,拷贝就会付出很大的代价。这里暂时先了解这么多(不好举例)。

5.4 const引用

引用const对象必须用const引用,const引用也可以引用普通对象,因为对象的访问权限可以在引用过程中进行平移和缩小,但不能放大

intmain(){int a =10;//权限平移int& ra = a;//const引用也可以引用普通对象//权限缩小constint& rra = a;int b =20;// 2 * b是一个表达式, 2 * b的结果存在临时对象中// 临时对象具有常性,要常引用才可以//int& rb = 2 * b;//errconstint& rb =2* b;// b是int类型,rrb是double类型//存在类型转换的问题,b会转换成double类型存放在临时对象中//double& rrb = b;//errconstdouble& rrb = b;return0;}

临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象,C++把这个未命名对象叫做临时对象临时对象具有常性

6. 指针和引用的关系

.引用是给已存在的变量取别名,不开辟内存空间,指针存储变量的地址,要开空间

.引用一旦引用一个实体就不能再引用其它实体,指针可以不断的改变指向对象

.引用必须初始化,指针建议初始化

.引用可以直接访问指向对象,指针需要解引用才可以访问指向对象

.sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(与平台大小有关)

.指针容易出现空指针,野指针的问题;引用相对安全一些

7. inline函数

8. nullptr

NULL实际上是一个宏,在传统的C头文件(stddef.h)中,有如下代码:

在这里插入图片描述

.在C++中,NULL被定义为字面常量0,C中被定义为无类型指针(void*)的常量

.C++11中引入了nullptrnullptr是一个特殊的关键字nullptr是一种特殊类型的字面量它可以转换成任意其他类型的指针类型使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式的转换为指针类型,而不能被转换为整数类型

voidf(int x){ cout <<"f(int x)"<< endl;}voidf(int* ptr){ cout <<"f(int* ptr)"<< endl;}intmain(){//本意是调用f(int* ptr)函数,但由于NULL被定义成0,所以调用f(int x)函数f(NULL);//强转f((int*)NULL);//nullptr能被转换成任意类型的指针类型f(nullptr);return0;}

Read more

【Linux】du 命令查看文件和目录的磁盘占用

【Linux】du 命令查看文件和目录的磁盘占用

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Linux这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Linux `du` 命令详解:精准探查文件和目录的磁盘占用 * 一、`du` 命令简介 * 1.1 为什么使用 `du`? * 1.2 `du` 命令的运行原理 * 1.3 基本用法示例 * 二、`du` 命令的基础用法 * 2.1 显示当前目录的磁盘占用 * 2.2 显示指定目录的磁盘占用 * 2.3 显示指定目录下所有文件和目录的占用 * 2.4 以人类可读格式显示 * 三、`du` 命令的高级选项详解 * 3.1

By Ne0inhk

远程控制 OpenClaw:从群晖 Docker 到本地浏览器的完整隧道指南

## 背景 OpenClaw 是一个强大的浏览器自动化框架,其核心服务通常运行在服务器端(如群晖 NAS),而控制端则是本地的 Chrome 浏览器插件 **OpenClaw Browser Relay**。插件默认只连接本地的 `127.0.0.1:18792`,无法直接与远程服务通信。因此,我们需要建立一条安全的隧道,将远程服务的端口映射到本地,让插件“以为”服务就在本地。 本文记录了在群晖 NAS(通过 Docker 运行 OpenClaw)与 Windows 本地电脑之间实现这一目标的全过程,包括踩坑与解决方案。所有敏感信息均已脱敏。 --- ## 环境 - **远程服务器**:群晖 DS220+,IP `192.168.1.100`(示例) - **OpenClaw

By Ne0inhk
ARM Linux 驱动开发篇---Linux 设备树简介-- Ubuntu20.04

ARM Linux 驱动开发篇---Linux 设备树简介-- Ubuntu20.04

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》   《嵌入式linux驱动开发》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言 一、什么是设备树? 二、DTS、DTB 和 DTC 三、DTS编译规则 四、DTB 文件最终如何被内核使用? 总结 前言 在传统驱动中,GPIO址、中断号、时钟参数等硬件信息都硬编码在代码里,换一块开发板就要改一次驱动;而设备树通过.dts文件统一描述所有硬件资源,驱动只需通过标准 API获取资源,实现 “一次编写、多板适配”。如今设备树已经成为 Linux 驱动开发的核心规范,是每一位嵌入式

By Ne0inhk
Apache IoTDB产品介绍与Kubernetes 1.24集群安装部署深度指南

Apache IoTDB产品介绍与Kubernetes 1.24集群安装部署深度指南

引言 在物联网(IoT)与工业互联网蓬勃发展的今天,时序数据管理已成为企业数字化转型的核心挑战。Apache IoTDB作为专为物联网场景设计的开源时序数据库,凭借其高性能、低成本、易扩展的特性,在智能制造、车联网、能源监控等领域得到广泛应用。本文将深度解析IoTDB v1.3.3.2的产品架构与核心优势,并基于Kubernetes 1.24集群环境提供完整的安装部署方案,包含从环境准备到验证测试的全流程操作,确保读者可复制部署并投入生产使用。 一、Apache IoTDB产品深度解析 1.1 物联网时序数据管理痛点 传统关系型数据库在处理海量时序数据时面临显著瓶颈:高频率采样导致写入压力激增,乱序数据插入引发性能下降,长期存储成本高昂,多维度分析需求复杂。IoTDB针对这些痛点进行专项优化,通过以下技术创新实现突破: * 分层存储架构:采用内存缓存+磁盘持久化的混合存储模式,支持数据冷热分级存储,历史数据自动归档至低成本存储介质。 * TsFile存储引擎:自主研发的列式存储格式,通过时间戳-值对压缩算法实现5-10倍存储空间节省,支持时间分区与数据版本管理。 *

By Ne0inhk