您现在的位置是:首页 >技术交流 >C++的入门知识(上)网站首页技术交流
C++的入门知识(上)
目录
一.命名空间
1.1命名空间的基本概念
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存
在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,
以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
#include<iostream>
using namespace std;
int rand=0;
int main()
{
cout << rand << endl;
}
像上面的代码运行结果如下:
这样的结果可以发现,命名和C++标准库中的rand函数发生了冲突,在c语言中这样的冲突是没法解决的,所以c++引进了一种新办法——>命名空间 关键字:namespace
例如C++标准库中提供的对象都存放在std这个命名空间中,就像cin、cout、endl、swap函数。
所以我们在C++的程序中都会看到using namespace std;这句话的作用主要是把命名空间中的内容展开(就如放在全局区) 看到这一定会有疑问,为什么要把该命名空间展开呢?原因:编译器不会主动去找命名空间中的内容,这样当编译链接的时候就会报错
namespace lx
{
int a = 0;
}
int main()
{
cout << a << endl;
return 0;
}
1.2命名空间的定义
①命名空间的一般定义方式
namespace lx //定义命名空间lx
{
int a = 0; //成员变量
void print(int x) //成员函数
{
cout << x << endl;
}
}
命名空间中既可以定义变量也可以定义函数
②命名空间的嵌套定义
namespace lx //定义命名空间lx
{
int a = 0; //成员变量
void print(int x) //成员函数
{
cout << x << endl;
}
namespace lx2 //嵌套定义lx2
{
int b = 1;
int Add(int x,int y)
{
return x + y;
}
}
}
③定义不连续的命名空间
namespace lx
{
int a = 0;
void print(int x)
{
cout << x << endl;
}
namespace lx2
{
int b = 1;
int Add(int x,int y)
{
return x + y;
}
}
}
double c = 1.0;
namespace lx
{
int c = 1;
}
命名空间可以不连续,就如在同一个项目中可以存在相同名称的多个命名空间,最后编译器会将这些命名空间合并为一个命名空间
1.3命名空间的使用
上面已经说过命名空间不展开的话不会被访问到,命名空间中的内容只局限于该命名空间中,在命名空间外将不能被直接调用
①使用using namespace 将命名空间中内容展开
namespace lx
{
int c = 1;
}
using namespace lx;
int main()
{
cout << c << endl;
return 0;
}
②利用命名空间标识符及作用域限定符引入命名空间成员
namespace lx
{
int c = 1;
}
int main()
{
cout << lx :: c << endl;
return 0;
}
命名空间标识符为" lx" 作用域限定符为" ::"
③使用 using将命名空间的部分成员展开
namespace lx
{
int a = 0;
void print(int x)
{
cout << x << endl;
}
namespace lx2
{
int b = 1;
int Add(int x,int y)
{
return x + y;
}
}
}
using lx::print;
using lx::lx2::Add;
int main()
{
int a = 0;
int b = 1;
print(a);
cout << Add(a, b) << endl;
return 0;
}
注:上面通过using引入print函数,Add函数,使用命名空间中的成员函数时,不再添加命名空间标识符“lx”和作用域限定符“::”,这样写程序的时候会方便不少。另外需要注意的是,当主函数中定义了一个和命名空间中的变量一样名字的变量的时候,访问的时候会先访问主函数中的变量,如果需要访问命名空间中的变量需要使用命名空间标识符和作用域限定符指定访问命名空间中的变量
如:
namespace lx
{
int a = 0;
void print(int x)
{
cout << x << endl;
}
namespace lx2
{
int b = 2;
int Add(int x,int y)
{
return x + y;
}
}
}
using lx::print;
using lx::lx2::b;
using lx::lx2::Add;
int main()
{
int a = 0;
int b = 1;
print(b);
cout << Add(a,lx::lx2:: b) << endl;
return 0;
}
二、C++输入&&输出
说明:
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。
5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,
这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有
一个章节更深入的学习IO流用法及原理。
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,
规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因
此推荐使用<iostream>+std的方式。
int main()
{
int a = 0;
int b = 1;
double c = 2.0;
cout<< a << b << c << endl;//自动识别变量类型
return 0;
}
std命名空间的使用惯例:
std是C++标准库的命名空间,如何展开std使用更合理呢?
1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对
象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +
using std::cout展开常用的库对象/类型等方式。
今天的知识就分享到这了!!!感谢支持!