C++认识及域的概念

初识C++以及域的概念

C++与C的关系

相较于C语言,C++是在C语言上的扩充,补充C语言的不足,如今C++兼容绝大部分C,但是也有极小部分是不兼容的。

C语言无法解决命名冲突的问题,只有全局和局部的概念,C++提出域的概念,新增了命名空间域和类域

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
 // C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
 {
    printf("%d\n", rand);
 	return 0;
 }
 // 编译后后报错:error C2365: "rand": 重定义;以前的定义是"函数"
 //在<stdlib.h>这个头文件中包含一个rand函数

域的概念

全局域与局部域都会影响生命周期和访问

命名空间域不会影响生命周期,只会影响访问
当编译器遇到一个变量的时候,会就近原则进行搜索,先局部,后全局。如果指定了就去指定域搜索。
命名空间域就解决了命名冲突的问题。

cpp 复制代码
namespace name1
{
	int x = 10;
}
namespace name2
{
	int x = 20;
}
#include <stdio.h>

int main()
 {
 	printf("%d\n", x);//搜索不到报错
    printf("%d\n", name1::x);//输出10
    printf("%d\n", name2::x);//输出20
 	return 0;
 }

域作用限定符

::成为域作用限定符,如果前面什么都不加默认全局域。

cpp 复制代码
#include <stdio.h>
int x = 10;
int main()
 {
 	int x = 20;
    printf("%d\n", x);//输出20
    printf("%d\n", ::x);//输出10
 	return 0;
 }

同名的命名空间

两个相同的命名空间域会被合并,如果这两个域有相同的变量名就会报错,产生命名冲突

cpp 复制代码
namespace name1
{
	int x = 10;
}
namespace name1
{
	int x = 20;
}//两个域会被合并,然后报错,如果没有相同的变量就不会报错

命名空间域的定义

命名空间域不仅可以定义变量,还可以定义结构体,定义函数等,而且命名空间域里面可以套命名空间域

对于结构体的定义就是struct name::Node phead;命名空间的名字要写在中间

cpp 复制代码
#include <stdio.h>
namespace name
{
	int x = 10;
	namespace na
	{
		int x = 100;
	}
	int Add(int a, int b)
	{
		return a + b;
	}
	struct Node
	{
		struct Node* next;
		int val;
	}
}
int main()
{
	printf("%d ", name::Add(1, 2));
	printf("%d ", name::na::x);//输出100
	//name::struct Node phead;错误的
	struct name::Node phead;
}

命名空间展开

using namespace name将域展开,相当于把命名空间域展开变为了全部域,这样在使用域中的变量的时候就不需要带域的名字了。

cpp 复制代码
#include <stdio.h>
namespace name
{
	int x = 10;
	int Add(int a, int b)
	{
		return a + b;
	}
	struct Node
	{
		struct Node* next;
		int val;
	}
}
using namespace name;
int main()
{
	printf("%d ", Add(1, 2));
	struct Node phead;
}

std是所有C++库的命名空间,我们可以把std展开,这样就不需要每次使用库的时候都加std::

cpp 复制代码
#include <iostream.h>
using namespace std;
int main()
{
	std::cout << "hello world" << std::endl;//每次都加std很麻烦
	cout << "hello world" << endl;//域展开后不需要再加std
}

命名空间展开容易引起冲突,在项目中尽量不展开

如果只是某一种常用的话就可以展开其中一个

cpp 复制代码
#include <iostream.h>
using std::cout;
using std::endl;
int main()
{
	cout << "hello world" << endl;//展开特定的后不需要再加std
}
相关推荐
秋9几秒前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
huangdong_1 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
搬砖魁首1 小时前
基础能力系列 - 多线程2 - 条件变量
c++·rust·条件变量·原子类型·线程同步互斥
youngerwang1 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
chase_my_dream1 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
牛油果子哥q1 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
KaMeidebaby1 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
天佑木枫2 小时前
15天Python入门系列 · 序
开发语言·python
手写码匠2 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc