c++与c

devtools/2024/12/23 3:29:42/

命名空间的设置:

避免冲突

命名空间:

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

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

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

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

//命名空间的定义方式
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.ppmy.cn/devtools/45963.html

相关文章

头歌算法-刷题

递归与循环 1.找出 5 个自然数中取 3 个数的组合 循环算法 #include <stdio.h>void combloop1(int n, int r) {/********** Begin **********/int arr[]{1,2,3,4,5};nsizeof(arr)/sizeof(arr[0]); for(int i0;i<n-2;i){for(int ji1;j<n-1;j){for(int kj1;k<…

小公司的软件开发IT工具箱

目录 工具链困境 难题的解决 达到的效果 资源要求低 工具箱一览 1、代码管理工具 2、自动化发版&#xff08;测试&#xff09;工具 3、依赖库&#xff08;制品包&#xff09;管理 4、镜像管理 5、授权管理&#xff08;可选&#xff09; 待讨论&#xff1a;为什么不是…

日常开发坑记录

hutool工具类转换,anInt可能为负数(队列散列需求遇到)long l = RandomUtil.randomLong(0, 9999999999L);Integer anInt = Convert.toInt(l);System

20232815 2023-2024-2 《网络攻防实践》实践十一报告

20232815 2023-2024-2 《网络攻防实践》实践十一报告 1.实践内容 网络渗透&#xff1a; 网络渗透是攻击者常用的一种攻击手段&#xff0c;也是一种综合的高级攻击技术&#xff0c;同时网络渗透也是安全工作者所研究的一个课题&#xff0c;在他们口中通常被称为”渗透测试&…

短视频矩阵系统搭建开发,ai智能剪辑系统,矩阵发布,一键管理多个账户

前言&#xff1a; 企业短视频矩阵是企业通过搭建多个短视频平台账号&#xff0c;形成一个多元化的内容传播网络。它旨在通过多平台内容的同步传播&#xff0c;实现企业品牌价值的最大化。短视频矩阵包括抖音、快手、视频号、小红书、百家号等热门短视频平台&#xff0c;其核心…

网关(Gateway)- 自定义过滤器工厂

自定义过滤工厂类 DemoGatewayFilterFactory package com.learning.springcloud.custom;import org.apache.commons.lang.StringUtils; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChai…

微信小程序分销商城源码系统 区域代理+收银台+兑换中心 功能强大 附带完整的安装代码包以及搭建教程

系统概述 微信小程序分销商城源码系统是一款基于微信小程序平台开发的电商系统&#xff0c;旨在为商家提供全方位的电商解决方案。该系统采用先进的技术架构&#xff0c;支持多平台、多终端访问&#xff0c;能够满足不同商家的业务需求。系统拥有简洁明了的用户界面和丰富的功…

【Java数据结构】详解Stack与Queue(二)

&#x1f512;文章目录: 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.栈的应用场景 2.1逆序打印链表 2.2逆波兰表达式求值 2.3括号匹配 2.4出栈入栈次序匹配 2.5最小栈 3. 栈 虚拟机栈 栈帧的区别 4.总结 1.❤️❤️前言~&#x1f973…