【c++】c++第一课:命名空间

文章目录

  • 1.C++的第⼀个程序
  • 2.命名空间
    • [2.1 namespace的价值](#2.1 namespace的价值)
    • [2.2 namespace的定义](#2.2 namespace的定义)
    • [2.3 命名空间使⽤](#2.3 命名空间使⽤)

最新的c++标准(建议收藏)

1.C++的第⼀个程序

++C++兼容C语⾔绝⼤多数的语法++,所以C语⾔实现的helloworld依旧可以运⾏,C++中需要把定义⽂件代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译

c 复制代码
#include<stdio.h> 
int main() 
{ 
    printf("hello world\n");  
    return 0; 
}

当然C++有⼀套⾃⼰的输⼊输出,严格说C++版本的helloworld应该是这样写的:

cpp 复制代码
#include<stdio.h> 
using namespace std; 
int main() 
{ 
    cout << "hello world\n" << endl;  
    return 0; 
}

2.命名空间

2.1 namespace的价值

在C/C++中,变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。

同一作用域不可重复定义同个变量

使⽤命名空间的⽬的是++对标识符的名称进⾏本地化,以避免命名冲突或名字污染++,namespace关键字的出现可以解决这个问题

cpp 复制代码
//rand在全局作用域出现两次
#include<stdio.h>     
#include<stdlib.h>//包含rand函数  
int rand = 10;//新的全局变量 
int main() 
{ 
    // 编译报错:error C2365: "rand": 重定义;以前的定义是"函数"  
    printf("%d\n", rand);//不知打印哪个 
    return 0; 
}

2.2 namespace的定义

• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,++不同的域可以定义同名变量++,所以下⾯的rand不在冲突了

• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所以如果有了域隔离,名字冲突就解决了(局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期)

• ++namespace只能定义在全局++ ,++而且还可以嵌套定义++

++• 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突++

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

cpp 复制代码
#include<stdio.h>     
#include<stdlib.h>  
// 1. 正常的命名空间定义  
namespace name 
{ 
    // 命名空间中可以定义变量/函数/类型  
    int rand = 10; 
    int Add(int left, int right) 
    { 
        return left + right; 
    } 
    struct Node 
    { 
        struct Node* next; 
        int val; 
    }; 
} 
int main() 
{ 
    // 这⾥默认是访问的是全局的rand函数指针
    //编译器语法查找确认,默认先局部查找->全局查找
    //::域作用限定符
    printf("%p\n", rand); 
    // 这⾥指定name命名空间中的rand
    //编译器语法查找确认,指定作用域,就直接去这个域查找->没有找到就报错未声明的标识符
    printf("%d\n", bit::name); 
    return 0; 
}
cpp 复制代码
//2. 命名空间可以嵌套  
namespace name 
{  
    namespace wl
    { 
        int rand = 1; 
        int Add(int left, int right) 
        { 
            return left + right; 
        } 
    }  
    namespace wll
    { 
        int rand = 2; 
        int Add(int left, int right) 
        { 
            return (left + right)*10; 
        } 
    } 
} 
int main() 
{ 
    printf("%d\n", name::wl::rand); 
    printf("%d\n", name::wll::rand); 
    printf("%d\n", name::wl::Add(1, 2)); 
    printf("%d\n", name::wll::Add(1, 2)); 
    return 0; 
} 

2.3 命名空间使⽤

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,++不会到命名空间⾥⾯去查找++。所以下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

• 指定命名空间访问,项⽬中推荐这种⽅式。

• using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。

• 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

cpp 复制代码
#include<stdio.h>     
namespace bit 
{ 
    int a = 0; 
    int b = 1; 
} 
int main() 
{ 
    // 编译报错:error C2065: "a": 未声明的标识符  
    printf("%d\n", a); 
    return 0; 
}
cpp 复制代码
// 指定命名空间访问  
int main() 
{ 
    printf("%d\n", N::a); 
    return 0;  
} 
// using将命名空间中某个成员展开  
using N::b; 
int main() 
{ 
    printf("%d\n", N::a); 
    printf("%d\n", b); 
    return 0;  
} 
// 展开命名空间中全部成员  
using namespace N; 
int main() 
{ 
    printf("%d\n", a); 
    printf("%d\n", b); 
    return 0;  
} 

注意:允许存在未命名的空间

cpp 复制代码
#include<stdio.h>
namespace
{
	int a = 0; 
    int b = 1; 
}
int main()
{
    printf("%d",a);
}
相关推荐
youngee11几秒前
hot100-53搜索旋转排序数组
数据结构·算法·leetcode
.简.简.单.单.2 分钟前
Design Patterns In Modern C++ 中文版翻译 第十一章 享元模式
c++·设计模式·享元模式
烟雨梵兮2 分钟前
-刷题小结19
算法
BestOrNothing_20153 分钟前
C++ 智能指针深入:四种智能指针所有权模型、原理与常见陷阱全景解析
c++·内存管理·智能指针·raii·内存销毁
C雨后彩虹13 分钟前
ConcurrentHashMap 核心锁机制:CAS+Synchronized 的协同工作原理
java·数据结构·哈希算法·集合·hashmap
兵哥工控14 分钟前
mfc高精度定时器精简版实例
c++·mfc
爱学大树锯15 分钟前
1361 · 文字并排
算法
Tisfy23 分钟前
LeetCode 2483.商店的最少代价:两次遍历 -> 一次遍历
算法·leetcode·题解·遍历
集芯微电科技有限公司27 分钟前
DC-DC|40V/10A大电流高效率升压恒压控制器
c语言·数据结构·单片机·嵌入式硬件·fpga开发
C雨后彩虹30 分钟前
HashMap的线程安全问题:原因分析与解决方案
java·数据结构·哈希算法·集合·hashmap