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

【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)

一. 命名空间

1. 定义

出现的意义:解决各种函数、关键词和类的名称冲突问题。

定义方式namespace + 命名空间的名字 + { }

                       (注意!}后面不加;)                            

  • namespace 是关键词
  • 命名空间的内容成员,可以是变量,函数,类型
  • 可嵌套定义
  • 同一个项目(工程)中允许存在多个相同名称的命名空间,编译器最后会合并到一个命名空间中。
namespace N1 
{//变量int a=1;int b=2;//函数int Add(int a, int b) {return a + b;}//结构体类型struct Node{struct Node* next;int val;};//在N1命名空间中嵌套定义N2namespace N2{int a=3;}}

2. 访问

 命名空间内部可直接访问,外部需指定出他属于的命名空间。

法一 用访问限定符(::)直接访问

int main() {printf("%d\n", N1::a);//1printf("%d\n", N1::N2::a);//3return 0;
}

法二  用using展开命名空间里某个单独的成员

using N1::b;
int main() {//对比 :printf("%d\n", N1::a);//1printf("%d\n", b);//2return 0;
}

法三 using展开命名空间的全部成员 

using namespace N1;
int main() {printf("%d\n", a);//1printf("%d\n", b);//2return 0;
}

3. 说明

工程项目中:可能会产生命名冲突,所以把常用库里面一些对象或者类型展出来。

比如:using std::cin、using std::cout 等。

日常练习中:不在乎跟库命名冲突,所以可以把库的命名空间全部展开。

比如:using namespace std;

 

二. C++ 中的输入和输出

  • cin >> 标准输入
  • cout << 标准输出
  • 需要 <iostream>头文件 和 std的命名空间
#include <iostream>
using namespace std;//日常练习using namespace std::cin;//建议项目工程时这么定义
using namespace std::cout;
int main() {int a;cin >> a;//10cout << a;//10return 0;
}

三. 缺省参数

1. 概念

缺省参数是在定义或声明函数时为函数的参数指定一个默认值

调用该函数时,如果没有传对应的实参的值,则该参数就使用之前设定好的默认值(缺省值)。

// Func 函数有一个缺省参数
void Func(int a = 0)
{cout<<a<<endl;
}int main()
{// 没有传参时,使用参数的缺省值Func();   // 传参时,使用指定的实参Func(10); 
}

2. 分类 

1、全缺省(形参全部给定缺省)

void Func(int a = 1,int b = 2,int c = 3) {cout << a << endl;//1cout << b << endl;//2cout << c << endl;//3
}

 2、半缺省参数(形参必须从右往左连续缺省,不可间隔缺省!)

void HalfFunc(int a, int b = 10, int c = 20) {cout << a << endl;//66cout << b << endl;//77cout << c << endl;//20
}int main() {HalfFunc(66,77);return 0;
}

 3. 注意事项

  1. 参数缺省时,必须从右往左连续缺省。
  2. 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参
  3. 缺省参数不能在函数的声明和定义中同时出现。如果声明和定义分离的话,建议在声明那里缺省,这样便于在头文件里查找修改。
  4. 缺省值必须是常量或者全局变量
  5. C语言不支持缺省参数(编译器不支持)

四. 函数重载

c++允许实现功能类似参数列表不同同名函数。

这里的参数列表不同指的是参数的类型、顺序、个数不同

 构成函数重载的条件

1. 参数个数不同

void f(int a)
{ }
void f()
{ }

2. 参数类型不同 

int f(int a)
{ }
double f(double a)
{ }

3. 参数顺序不同

void f(int a,char b)
{ }
void f(char b,int a)
{ }

 注意事项

1. 返回类型不同不构成重载

// 返回值类型都为 int
int Add(int a, int b)    
{}// 返回值类型为double
double Add(int a, int b) 
{}

2. 函数重载不可用缺省函数 

void func(int a)
{}void func(int a,int b=10)
{}int main()
{// error:不明确到底是调用带缺省的还是不带缺省的func(10);
}

五. 引用

1. 概念

给已存在变量取别名,共用同一块内存空间,但编译器不会为该引用变量开辟内存空间。

(类似 林冲又叫豹子头,人民币又叫毛爷爷)

使用规则: 类型& 引用变量名 = 引用实体;

int main()
{int a = 10;int& ra = a;// ra 引用 a//也可以给别名取别名int& rra = ra;// rra 引用 ra//a和ra和rra地址相同printf("%p\n", &a);printf("%p\n", &ra);printf("%p\n", &rra);return 0;
}

 2. 注意事项  

  • 引用变量在定义时必须初始化,即必须有引用实体。
  • int& ra;//error
    
  • 一个变量可以有多个引用。(人民币可以叫毛爷爷,也可以叫钞票)
  • 一个引用对象只能引用一个实体。(毛爷爷只能是人民币的别名,不能是你爷爷)

3. 引用和const(访问权限的放大与缩小)

首先,我们知道的是 int 访问权限(可读可写)大于 const int(仅可读)。 

我们要知道一个概念,引用的访问权限只可缩小,不可放大

int main()
{// error:权限放大const int a = 10;int& ra = a; //正常编译:允许权限缩小int b = 10;const int& rb1 = b;//权限缩小int& rb2 = b;//权限相等return 0;
}
v

 4. 使用及相比的优点

(1)代替指针传参

//减少了c语言中指针对地址的解引用操作,可以直接修改实参的值
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}

(2)做返回值

//函数返回值就是实参本身,减少了临时变量的创建,提高效率//传引用返回
int& Count()
{static int n = 0;n++;//返回n本身return n;
}//传值返回
int Count()
{static int n = 0;n++;//返回n的值的一份临时拷贝对象return n;
}

特别说明,引用返回容易造成的非法访问

 

 5. 指针和引用的区别(精简三点!)

  • 引用不能指向空值(null),而指针可以。
  • 引用在使用时不需要解引用操作(不需要 * 符号),而指针需要。
  • 引用在定义时必须初始化,而指针可以在后续指向不同的对象。

六. 内联函数

1. 概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方把函数内容展开,从而替换对函数的调用,没有函数压栈的开销,内联函数可以提升程序运行的效率

//定义两个数相加的内联函数
inline int Add(int a, int b)
{return a + b;
}
  • 代码很长或者有递归的函数不适宜使用作为内联函数。inline是一种以空间换时间的做法,省去调用函数栈帧的开销。
  • inline不建议声明和定义分离,这样会导致链接错误。因为inline既要要被展开,就没有函数地址了,链接就会找不到

 2. c++替代宏的方法

  • 常量定义 :换用const来修饰
  • 函数定义: 换用内联函数

七. nullptr与NULL

NULL 预处理后:0 (可能被定义为字⾯常量0,使用需要类型转换)
nullptr 预处理后:(void*)0 (隐式地转换为指针类型,避免类型转换问题)

故在c++,可以使用nullptr代替NULL传递空指针。

相关文章:

【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)

一. 命名空间 1. 定义 出现的意义&#xff1a;解决各种函数、关键词和类的名称冲突问题。 定义方式&#xff1a;namespace 命名空间的名字 { } &#xff08;注意&#xff01;}后面不加&#xff1b;&#xff09; namespace 是关键词命名空间的…...

uniapp自定义导航栏以及页面加背景

如果想给uniapp的页面加背景图片的话&#xff0c;疯狂度了之后会发现uniapp中背景图片用本地图片不起效果&#xff0c;所以一般用网络路径&#xff0c;之后又会发现&#xff0c;页面如果直接加背景的话有可能会遇到页面内容不够&#xff0c;背景撑不满整个页面&#xff0c;如果…...

MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式,光标下方永远会出现的CapsLock箭头Icon的去除办法

如图&#xff0c;MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式下&#xff0c;光标下方永远会出现一个CapsLock箭头Icon。此Icon挡住视野&#xff0c;还容易误触导致切换大小写状态&#xff0c;带来的收益远远小于带来的困扰。 解决办法 打开终端&#xff0c;输入以下…...

C#基础(10)变长参数和参数默认值

前言 作为函数的补充知识点&#xff0c;我们已经学习了ref和out&#xff0c;接下来两节我们继续来讲函数相关的内容。本节则讲解变长参数和参数默认值。 函数语法 关键字&#xff1a;params public void PrintNumbers(params int[] numbers) {for 相关逻辑 } 注意 params…...

Vue转React开发经验分享——hooks写法如何触发react生命周期、如何触发数据更新?

背景&#xff1a;习惯了vue的写法&#xff0c;并且vue2和vue3都比较熟悉&#xff0c;在转react开发中&#xff0c;不停的思考react和vue框架的相似之处&#xff0c;以及vue中的写法在react里怎么替换。本文将组件更新或组件生命周期角度出发聊聊如何使用hooks触发生命周期&…...

算法入门-贪心1

第八部分&#xff1a;贪心 409.最长回文串&#xff08;简单&#xff09; 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回通过这些字母构造成的最长的回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串…...

element-plus的面包屑组件el-breadcrumb

面包屑组件主要用来显示当页面路径&#xff0c;以及快速返回之前的页面。 涉及2个组件 el-breadcrumb 和el-breadcrumb-item, el-breadcrumb的spearator指定item的分隔符 el-breadcrumb-item的to和replace属性和vue-router的一致&#xff0c;需要结合vue_router一起使用 用法…...

推荐几个网盘资源站给大伙,找资源更方便

夸克网盘在当前已然成为极为主流的网盘之一&#xff0c;其功能体验堪称强大&#xff0c;不仅支持在线解压阅读&#xff0c;磁力离线等功能也十分出色。那么&#xff0c;究竟该如何寻找夸克资源呢&#xff1f;下面&#xff0c;我就来为大家分享几个堪称神级的夸克资源网站。 一、…...

【Qt】Qml界面中嵌入C++ Widget窗口

1. 目的 qml做出的界面漂亮&#xff0c;但是执行效率低&#xff0c;一直想找一个方法实现qml中嵌入c界面。现在从网上找到一个方法&#xff0c;简单试了一下貌似可行&#xff0c;分享一下。 2. 显示效果 3. 代码 3.1 工程结构 3.2 pro文件 需要添加widgets > QT quick …...

Python快速入门 —— 第五节:接口开发

第五节:接口开发 目标: 学习使用Flask框架开发简单的Web接口,实现对学生信息的增删改查,通过HTTP请求与应用交互。 内容: Flask简介: Flask是一个轻量级的Python Web框架,使用简单,扩展性强,适合快速开发Web应用。安装Flask: pip install flask创建Flask应用: fr…...

利用secureCRT向虚拟机发送文件(secureCRT安装使用教程)

链接: secureCRT 链接:https://pan.baidu.com/s/1CvNYzoBbLVkyYNFq7hrT0g 提取码:5974 链接: secureCRT安装使用教程 链接:https://pan.baidu.com/s/1Bbi7SqyJBere8G53BCYL5A 提取码:xjw1...

AI杂七杂八系列(1)——工程篇

1. 远程服务器无法登录问题 2. 内存溢出解决方法 3. Padding 4. try...except...处理异常报错 5. view、expand、repeat、transpose、permute和squeeze、unsqueeze的区别 1. 远程服务器无法登录问题 权限可能是root权限&#xff0c;修改权限 用户权限&#xff1a; sudo c…...

学习大数据DAY58 增量抽取数据表

作业 1 SQL 优化的常见写法有哪些 - 面试经常被问 使用索引&#xff1a;合理创建和使用索引是提高查询效率的关键。索引可以加速数据的检 索速度&#xff0c;但是索引也会占用额外的存储空间&#xff0c;并且在插入、删除和更新操作时会 有额外的开销。 避免全表扫描&…...

HTTPTomcat

HTTP&Tomcat&Servlet 今日目标&#xff1a; 了解JavaWeb开发的技术栈理解HTTP协议和HTTP请求与响应数据的格式掌握Tomcat的使用掌握在IDEA中使用Tomcat插件 1&#xff0c;Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;…...

Python数据分析-Matplotlib快速入门

一、pyplot 二、绘图 1.绘制x和y的点 2.无线绘图 3.多点 4.默认x点 三、标记 1.标记 2.参考 3.格式化字符串 4.尺寸 5.颜色 四、线条 1.线形 两个都是设置虚线 2.更短的语法 3.线参考 4.线条颜色 5.线宽度 6.多条线 也可以 五、标签 1.为绘图创建标签 2.为绘图设置标题 3…...

重塑在线软件开发新纪元:集成高效安全特性,深度解析与评估支持浏览器在线编程的系统架构设计

目录 案例 【题目】 【问题 1】(13 分) 【问题 2】(12 分) 【答案】 【问题 1】解析 【问题 2】解析 相关推荐 案例 阅读以下关于软件架构设计与评估的叙述&#xff0c;回答问题1和问题2。 【题目】 某公司拟开发一套在线软件开发系统&#xff0c;支持用户通过浏览器…...

【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】003 - vmlinux.lds 链接脚本文件源码分析

【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】003 - vmlinux.lds 链接脚本文件源码分析 系列文章汇总:《鸿蒙OH-v5.0源码分析之 Uboot+Kernel 部分】000 - 文章链接汇总》 本文链接:《【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】003 - vmlinux.lds 链接脚本文件源码分析》 …...

MongoDB实现高级RAG:Parent-Document检索技术详解

MongoDB实现高级RAG&#xff1a;Parent-Document检索技术详解 引言 在人工智能和自然语言处理领域&#xff0c;检索增强生成(Retrieval-Augmented Generation, RAG)技术正在迅速发展。本文将介绍一种更高级的RAG实现方式&#xff1a;Parent-Document检索。我们将探讨如何使用…...

胡学乱想----前端知识点(css色彩)

1. margin 属性 简写 margin 属性有两个值时,它将 margin-top 和 margin-bottom 设置为第一个值,并将 margin-left 和 margin-right 设置为第二个值 .marker {width: 200px;height: 25px;background-color: red;margin: 10px auto; }2. rgb 属性 CSS 的 rgb 函数接收红色…...

GEE 案例——利用MODIS数据和NDWI指数进行美国五大湖水体计算和时序分析(直方图统计和面积统计)

目录 简介 MODIS数据 代码 结果 简介 利用MODIS数据和NDWI指数进行水体计算和时序分析(直方图统计和面积统计),这里我们统计了2001-2023年的美国五大湖的水域面积变化情况。 MODIS数据 MODIS/061/MOD09A1数据是由美国宇航局(NASA)的Moderate Resolution Imaging Spe…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

【R语言编程——数据调用】

这里写自定义目录标题 可用库及数据集外部数据导入方法查看数据集信息 在R语言中&#xff0c;有多个库支持调用内置数据集或外部数据&#xff0c;包括studentdata等教学或示例数据集。以下是常见的库和方法&#xff1a; 可用库及数据集 openintro库 该库包含多个教学数据集&a…...