一、命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1. 命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
以下为基础的命名空间定义
namespace N1
{
int a = 1; //定义变量
struct S
{
int* arr;
int n ;
}s; //定义结构体
int Add(int left, int right) //定义函数
{
return left + right;
}
}
命名空间还可以嵌套,示例如下
namespace N2
{
int a;
namespace N3
{
int b;
}
}
在同一工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
2. 命名空间的使用
2.1 命名空间名称及作用域限定符
通过域作用限定符——::,来使用命名空间中定义的变量或函数,其格式为命名空间名称::变量
如下所示,程序分别输出1,2,3
namespace N1
{
int a = 1;
struct S
{
int b;
int c;
}s;
int Add(int left, int right)
{
return left + right;
}
}
int main()
{
N1::s.b = 2;
int ret = N1::Add(1, 2);
printf("%d\n", N1::a);
printf("%d\n", N1::s.b);
printf("%d\n", ret);
return 0;
}
在命名空间中也可以只对结构体或者函数进行声明,但在外部创建结构体变量时,其格式需要注意
namespace N2
{
struct S
{
int c;
int d;
};
int ADD(int left, int right);
}
int N2::ADD(int left, int right)
{
return left + right;
}
int main()
{
struct N2::S s = { 2 ,1 };
int ret = N2::ADD(1, 4);
printf("%d\n", s.c);
printf("%d\n", ret);
return 0;
}
命名空间中的变量仍然是全局变量,命名空间不会影响变量的属性,只影响编译器查找变量的规则:
- 如果变量前面有域作用限定符修饰( :: ),则只会从命名空间中查找变量,没找到则报错
- 如果无域作用限定符,则先从main函数中查找变量,没找到再去全局变量中找,如果都没有则报错
2.2?使用using将命名空间中成员引入?????
使用 using N3::b?会将命名空间中的成员b解除限制,若定义了其他全局变量b,则会产生命名冲突
namespace N3
{
int a = 10;
int b = 20;
}
using N3::b;
int main()
{
printf("%d\n", N3::a);
printf("%d\n", b);
return 0;
}
2.2?使用using namespace 命名空间名称引入?
使用?using namespace N2;?会将命名空间中的所有成员解除限制,若有其他全局变量与命名空间N2中的变量名相同,则会产生命名冲突,慎用!!!
namespace N2
{
int a = 10;
int b = 20;
}
using namespace N2;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
二、C++输入&输出
首先我们认识C++的第一个程序,该程序的运行结果为输出 "Hello world"
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world" << endl;
return 0;
}
1. 看完上一章一定对?using namespace std; 比较熟悉了,C++库的实现定义在一个叫std的命名空间中,但其实这种写法并不好,容易产生命名冲突,可以用以下方式改进:
#include<iostream>
int main()
{
std::cout << "Hello world!!!" << std::endl;
return 0;
}
2. 不同于C语言中的printf打印输出 和 scanf输入,在C++中可以使用cout标准输出(控制台)和cin标准输入(键盘),"cout << "?表示将"<<"后的字符输出,同理,"cin >>" 表示输入至变量中,?endl表示换行。
使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c
#include<iostream>
using namespace std;
int main()
{
cout << "Hello world!!!" << endl;
cout << "Hello world!!!" << '\n';
cout << "Hello world!!!\n";
//自动识别类型
int i = 10;
double d = 1.11;
cout << i << " " << d << endl;
cin >> i >> d;
cout << i << " " << d << endl;
return 0;
}
|