c++与c

命名空间的设置:

避免冲突

命名空间:

如果将变量全部定义在全局可能不安全,都可以进行修改。

如果将变量定义在局部,当出了大括号就不能使用。

所以说在定义一个命名空间的时候

定义函数,变量,命名空间,都称为命名空间中的实体

//命名空间的定义方式
namespace hh
{
int val1 = 0;
char val2;
}// end of namespace hh

大括号后面可以加;也可以不加

定义的时候是没有缩进的,可以在最后一行添加注释使得结尾更加清晰

命名空间的使用方式:三种方式

1.作用域限定符

例如使用std命名空间中的cout    使用std::cout

准确但是繁琐

如果命名空间中套命名空间,需要 :: ::

2.using编译指令                 using name space  

尽量写在局部,既可以在局部(放在{}中)使用保证在用到的时候才能出来

可能会出现的问题是可能会和全局变量名出现冲突,借助于方式一作用域限定符帮助确定

当不清楚命名空间中的具体情况的时候,不要使用using,因为可能出现命名空间中的实体和自定义的变量和函数出现冲突。

3.using声明机制

初学阶段使用using声明机制,需要什么就添加什么,避免出现using冲突,同时避免每次使用加::

using std::cout;
using std::endl;

仍然是建议将using声明语句放在局部作用域中

【注意】即使命名空间中实体与全局位置实体重名,在局部位置也遵循“就近原则”形成屏蔽

#include <head.h>int num = 10;void test0(){//using声明语句using wd::num;using wd::func;//直接写函数名,不加括号//即使全局作用域存在同名的实体//此处也可以形成屏蔽效果//访问到时wd::numcout << "wd::num:" << num << endl;func();
}int main(){test0();    
}

对比使用using编译机制如果全局变量和namespace中变量名字相同会出现冲突,但是使用using声明机制在局部使用的时候会对于全局变量形成屏蔽。

命名空间的嵌套使用

//嵌套命名空间设置
namespace wd
{
int num = 100;void func(){cout << "func" << endl;
}namespace cpp
{
int num = 200;void func(){cout << "cpp::func" << endl;
}
}//end of namespace cpp}//end of namespace wd//调用方式
//方式一,使用作用域限定精确访问实体
void test0(){cout << wd::cpp::num << endl;wd::cpp::func();
}//方式二,using编译指令一次性引入cpp的实体
void test1(){using namespace wd::cpp;cout << num << endl;func();
}//方式三,using声明语句
void test2(){using wd::cpp::num;using wd::cpp::func;cout << num << endl;func();
}

【注意】在using编译机制中,指明使用哪一个命名空间的需要具体

匿名命名空间(与有名命名空间合在一起称为有名命名空间)

匿名命名空间和static定义的静态有点像,不会被跨文件使用到

匿名空间中的变量以及函数的使用,直接用就可以不像有名空间三种方式。

【注意】全局变量和匿名空间同名的变量和函数时,也就是冲突的时候,会有问题!!

【注意】如果使用::作用域限定符,也无法访问到匿名空间中重名的实体,只能访问到全局的实体。

跨模块调用

(1)跨模块调用函数和变量

【注意】如果是在一个文件中定义一个static变量或者函数那么也不能通过extern引入

【注意】匿名空间同理,这两类只能从本模块使用,不能跨模块使用

1. 可以定义在头文件中,是现在别的文件,然后在该文件中直接调用就可以

出现的问题就是把头文件中的内容全部引入进来,开销比较大

2. 可以使用extern的方式,

//externA.cc
int num = 100;void print(){
cout << "print()" << endl;
}//externB.cc
extern int num;//外部引入声明
extern void print();
void test0(){
cout << num << endl;
print();
}

告诉编译器我这有一个缺口,可以进行编译,但是谁来编译填补这个缺口,是在链接的时候确定

g++ externA.cc externB.cc 

【注意】大型项目使用的方式往往还是头文件的方式实现,小型文件使用extern方式。因为跨模块调用的关系不清晰,容易出错,比如说如果说多个文件都有同一个变量会出现冲突,外部引用时

(2)跨模块调用有名命名空间

【注意】不能直接用extern wd::val直接引用,需要在该文件中依然定义一个同名命名空间,在文件中使用extern int val;

【注意】在不同的文件中多次定义同名命名空间,多次定义都是放在这一个命名空间中。

【注意】不能跨模块调用匿名命名空间

命名空间中的内容可以进行定义或者声明,命名空间中不能使用实体,也不能对于声明的实体赋值。

命名空间的作用:

1.避免冲突的作用

2. 版本控制,一个版本中的代码保存在一个命名空间中另一个命名空间中

3. 声明主权的作用,命名空间名字(很特别的命名方式)注释可以表明是谁的

命名空间的使用方式:

1. 最好放在命名空间中,而不是全局

2. 尽量在局部使用而不是全局

3.  如果非要使用using编译指令,建议放在所有#include预编译指令后

4. 不要在头文件中使用using编译指令,这样,使得可用名称变得模糊,容易出现二义性

【注意】头文件的使用规则include多个头文件,首先放自定义的头文件,再放C的头文件,再放C++的头文件,最后放第三方库的头文件。

const关键字

const修饰内置类型(系统原有的int)

书写方式:const int num = 10;     int const num = 10;对于int和double来说效果是一样的。

使用方式:const关键字必须在一开始的时候就进行赋值,也是一个变量

与宏定义的比较:1.宏定义是在预处理的时候进行替换,const是在编译的时候进行处理  2.宏定义不能明确指明类型容易出错

【重点】const修饰指令类型

对于指针而言不同的书写方式会得到不同的效果。

int num1 = 10;
const int * p = &num1;
//可以修改指向不能修改指向的内容num1 = 20;
//这样也是可以的int const * p = &num1;
//这样也是一样的效果
//point to const 就是指针指向一个const类型元素,也就是不能修改元素值
//理解为围着int转不能修改值const int num3 = 1;
const int * p2 = &num3;
//此处设置指针的时候必须要加上constint num2 = 1;
p2 = &num2;
//const 指针也可以修饰非常量类型数据
int num1 = 10;
int * const num = &num1;
//可以通过指针修改指针指向的内容,但是不能修改指向
//称为常量指针 const to point  
//可以从右向左看,先看到const再看到*const int num3 = 1;
int * const p2 = &num3;//error
//因为这样定义的时候会理解为可以修改p2指向的内容,但是这个地方在定义num3的时候是不能改变值
//所以这样得话是会报错的

区分:数组指针和指针数组

函数指针和指针函数

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

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

相关文章

软件3班20240603

经典 报错 404 大概率 就是 这图 的 路径 写错i了 package com.yanyu;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jav…

现货白银的交易时间有多连贯?

国际市场上的现货白银优势很多&#xff0c;它除了具备国内同类型品种所不具备的数十倍资金杠杆外&#xff0c;也基本上实现了全天24小时不间断的交易时间&#xff0c;所以投资者可以在全天候连贯的行情中&#xff0c;寻找属于自己的交易获利机会。 但对于内地的投资者来说&…

从 Lerna 到现代化:原生 Workspaces 和 Changesets 的高效协作

1. 背景 最近新接手的一些 monorepo 的库项目&#xff0c;项目是用 lerna 进行管理的&#xff0c;使用过程中有一些不丝滑的地方&#xff0c;包括&#xff1a; lerna 版本过旧&#xff0c;使用 4.0.0&#xff08;现版本 8.1.3&#xff09;&#xff0c;功能差异过大&#xff0…

前端JS必用工具【js-tool-big-box】学习,检测密码强度

js-tool-big-box 前端工具库&#xff0c;实用的公共方法越来越多了&#xff0c;这一小节&#xff0c;我们带来的是检测密码强度。 我们在日常开发中&#xff0c;为了便于测试&#xff0c;自己总是想一个简单的密码&#xff0c;赶紧输入。但到了正式环境&#xff0c;我们都应该…

FullCalendar日历组件集成实战(8)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

【算法每日一练】新月轩就餐

思路&#xff1a; 其实很容易想到是双指针或者双端队列。 我们设置一个type表示当前区间已经有了多少种厨师&#xff0c;同时还需要记录区间中每个元素出现的次数&#xff0c;然后比较棘手的是移动问题了&#xff0c;什么时候移动呢&#xff1f; 我们可以发现当区间当队头元…

手眼标定学习笔记

目录 标定代码&#xff1a; 手眼标定原理学习 什么是手眼标定 手眼标定的目的 eye in hand eye to hand AXXB问题的求解 标定代码&#xff1a; GitHub - pumpkin-ws/HandEyeCalib 推荐博文&#xff1a; https://zhuanlan.zhihu.com/p/486592374 手眼标定原理学习 参…

国产操作系统上Vim的详解01--vim基础篇 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上Vim的详解01–vim基础篇 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用Vim的详解文章。Vim是一款功能强大且高度可定制的文本编辑器&#xff0c;广泛应用于编程和日常文本编辑中。…

记一次cms代码审计

000&#xff1a;前言 记录一次小型cms代码审计 001&#xff1a;任意文件删除 由于代码繁杂&#xff0c;不再一一展示 /app/controller/kindeditor.class.php 关键漏洞代码 public function delete() {$path ROOT_PATH.$_GET[pic];unlink($path);$flash M("flash&qu…

Postgre数据库初探

一、PostgreSQL介绍 PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES&#xff0c; 版本 4.2为基础的对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;。POSTGRES 领先的许多概念在很久以后才出现在一些商业数据库系统中。 PostgreSQL是最初的伯克利代码的开…

vscode编译c/c++找不到jni.h文件

解决办法: 一、下载JDK 访问Oracle官网的Java下载页面&#xff1a;Java Downloads | Oracle 选择适合您操作系统的JDK版本&#xff1a; 对于Windows&#xff0c;选择“Windows x64”或“Windows x86”&#xff08;取决于您的系统是64位还是32位&#xff09;。对于Linux&#…

RPM包方式离线部署gitlab

下载安装包 要求&#xff1a;可以联网&#xff0c;系统及版本与目标服务器一致。配置gitlab yum仓库 curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash 新建包存放目录 mkdir /root/gitlab 下载gitlab及相关安装包 …

老赛棍版端口,扫别人没扫到的资产

0x001 获取目标信息 因为某些敏感原因&#xff0c;这部分干脆以长沙为例&#xff0c;仅做查询方式参考。首先FOFA搜&#xff1a;region"Hunan" && city"Changsha"&#xff0c;全部转换为C段后去重&#xff0c;就得到该城市的大致网段&#xff1a;…

Android O Camera深度研究

目录 Adnroid O之前的Android camera软件框架 Adnroid O camera软件框架 Passthrough Mode Binderized mode Wrapper shim for libhardware HALs Wrapper shim for libhardware HALs Customized Treble Camera HAL/framework Camera HAL transition and removal plan …

Android精通值Fragment的使用 —— 不含底层逻辑(五)

1. Fragment 使用Fragment的目标&#xff1a;根据列表动态显示内容&#xff0c;更简洁显示界面、查找界面 eg. 使用新闻列表动态显示新闻 1.1 Fragment的特性 具备生命周期 —— 可以动态地移除一些Fragment必须委托在Activity中使用可以在Activity中进行复用 1.2 Fragmen…

新鲜速递:图解新颖LLM的CoPE位置编码

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

基于docker的oracle12.2.0.1部署及oracle使用与docker镜像容器制作迁移方法

基于docker的oracle12.2.0.1部署及oracle使用与docker镜像容器制作迁移方法 本文介绍了基于docker的oracle12.2.0.1部署&#xff0c;包含了oracle基本配置、监听器和实例启动方法、PDB和CDB操作方法、表空间建立和用户数据库建立、常见启动问题解决等&#xff0c;并介绍了镜像制…

二、go微服务项目“商城项目实战开发”第二步grpc和gin的直连调用

文章目录 商城项目实战开发-GRPC和GIN的直连调用01、本次课程微服务的技术栈02、用户服务接口定义和实现登录1、密码问题01、MD5的方式02、加盐的方式03、动态盐04、使用加盐框架passwordEncoder2、用户服务接口的暴露3、Grpc的实现步骤1.定义暴露接口2.编写user的调用文件3.编…

YOLOv8_obb预测流程-原理解析[旋转目标检测理论篇]

YOLOv8_obb的预测流程,主要分预处理模块、推理模块和后处理模块。这里面有很多内容是和目标检测预测流程是重合的,主要区别在于Angle分支、NMS后处理以及regularize_rboxes部分。本文也主要介绍一下这三个模块,其他模块可以结合YOLOv8预测流程-原理解析[目标检测理论篇]一起…

免费SSL证书的安全性与获取指南

SSL证书是一种数字凭证&#xff0c;用于加密用户与网站之间的信息交换&#xff0c;以确保传输的数据不被第三方窃取。它像是一个数字版的密封印章&#xff0c;为数据的传输过程提供了一层保护膜。 免费的SSL证书通常由CA机构提供&#xff0c;它们同样可以提供基础数据的加密服…