本文最后更新于39 天前,其中的信息可能已经过时,如有错误请发送邮件到PZ_0828@163.com
:: 双冒号 作用域运算符
直接:: 表示作用域为全局作用域
命名空间namespace
核心作用
- 解决命名冲突:隔离代码实体(函数、变量、类等)
- 组织代码:模块化大型项目结构
关键特性
命名空间下可以存放 函数、变量、结构体、类…
//使用命名空间 打开一个叫std的房间
using namespace std;
//命名空间必须放在全局作用域下
namespace test1
{
void function();
int A = 1;
struct B{
};
class C{
};
//命名空间可以嵌套命名空间
namespace test2
{
int A = 2;
}
}
命名空间是开放的 可以随时随地往原来的命名空间添加内容
namespace test1{
int AA = 11;
}
//此命名空间test1会和上面的命名空间test1进行合并
在使用命名空间时还会出现一种情况,即:无名/匿名命名空间
namespace{
int CC=33;
int DD=44;
}
//当使用无名命名空间后,以上语句就相当于 static int CC; static int DD;
//且只能在当前文件使用
命名空间可以起别名
//命名空间别名
namespace LongNamespaceName { int value = 42; }
namespace Short = LongNamespaceName; // 别名
void demo() {
std::cout << Short::value; // 输出42
}
使用方式对比
方式 | 代码示例 | 作用域影响 |
---|---|---|
全引入 | using namespace MyLib; | 当前作用域全部可见 |
单实体引入 | using MyLib::print; | 仅引入特定实体 |
作用域运算符 | MyLib::version++; | 精确指定无污染 |
using声明和using编译指令
待补充
C++对C语言的增强
全局变量检测增强
// C: 允许重复声明
int global;
int global = 10; // ✅ C允许
// C++: 严格检测
int global;
int global = 10; // ❌ 错误:重定义
函数检测增强
C++作为C语言的加强版本,相关要求也更严格
// C: 弱类型检测
int function( a, b) // 参数无类型
{
}
void test()
{
function(1, 2, 3); // 参数超量 ✅ C允许
}
//以上为C语言写法,该写法没有问题
// C++: 强类型检测
int fuction(int a, int b)//参数类型增强,函数的参数必须要定义类型
{
return a*b;//返回值检测增强,函数必须要有返回值
}
void test()
{
function(1, 2);//函数调用参数检测增强,使用函数时传递参数个数必须与函数定义的一致
func(1); // ❌ 错误:参数不足
}
类型转化检测增强
// C: 隐式转换
void test()
{
char *p = malloc(sizeof(64));//malloc返回值是void*,✅ C允许void*隐式转换
}
// C++: 需显式转换
void test()
{
char *p = (char *)malloc(sizeof(64));//malloc返回值是void*,在C++中void*变成char*,必须强转
}
struct 增强
// C: 单纯数据类型
struct Person
{
int m_Age;
//void plusAge(); //❌ C不允许成员函数
};
void test()
{
struct Person p1; //使用时必须带struct关键字
}
// C++: 类语义扩展
struct Person
{
int m_Age;
void plusAge(); //✅ 允许成员函数,C++中struct可加函数
};
void test()
{
Person p1; //C++可直接使用类型名,不需要加入struct关键字
p1.m_Age = 10;
p1.plusAge();
cout<<p1.m_Age<<endl;
}
bool类型增强
在C语言中是没有bool类型的,C语言不认识bool这个关键字
但C++认识
bool flag = true; //只有真或假 true代表 真(非0) false代表 假(0)
void test()
{
cout <<sizeof(bool)<<endl;//输出:1
flag = 100;
//bool类型,非0的值转为 1, 0就转为0
cout<<flag<<endl;
}
三目运算符增强
void test()
{
int a=10;
int b=20;
printf("ret = %d\n", a > b ? a : b);
cout<<"ret = "<<(a > b ? a : b)<<endl;
//(a > b ? a : b) = 100; //在C语言中这句话会报错,C语言会翻译为 20 = 100; 在C语言的逻辑中这显然是不对的 C语言中返回的是值
(a > b ? a : b) = 100; //b = 100 在C++中返回的是变量
/*若C语言中想模仿C++,可以采用如下写法
*(a > b ? &a : &b) = 100;
printf("a = %d, b = %d \n", a, b);
*/
}