下面对C++常见的语法进行分析:
1.命名空间
2.auto语句
1.命名空间
为了解决命名冲突的问题,C++之父提出来命名空间的概念
假设我现在要定义两个函数名,都要定义为print(且参数列表要相同,这里跟函数重载有关,下面有详细讨论),此时程序有BUG,,显示我已经重定义了,为了解决这个问题,可以使用命名空间
我将第二个print函数给封装起来了,此时程序不在报错
原因:编译器在寻找函数/变量时,先在局部里找,在往全局找和以展开的命名空间里找
(注意不会去未展开的命名空间里找)
并且搜索优先顺序为 1.局部 2.全局 / 已展开的命名空间里找
请注意展开命名空间的语法可以是 using namespace + 具体名字
这里展开命名空间是不会报错的,因为第二个print函数是存放在 a 中的,此时展开它,只会影响搜索函数或变量时的查询范围,而不会影响定义,因为此时两个函数的地址已经不一样了(这两个函数已经不一样了)
但此时要去调用print函数,程序会报错,因为编译器不知道去调用哪一个函数,C++中调用函数是通过函数名和参数列表来找函数定义的(这里与函数重载有关)
所以出现命名冲突时,尽量不要展开命名空间,以防出现错误
下面说一下如何展开命名空间中某一函数或变量
using + 命名空间名 :: 变量名 / 函数名
不需使用namespace
如何不展开,并且要使用命名空间中的函数/变量
命名空间名 ::变量名/ 函数名
2.auto 语句(auto可以替换类型比较长的定义)
使用auto 语句,必须初始化
例如:auto i = 1; 这个语句与 int i = 1;等价
typeid 可以确定一个对象的类型
语法 typeid(b).name() 确定b是什么数据类型
int x = 1 ;
auto b = x ; // 此时auto 相当于int
auto* c = &x ; auto d = &x ; // 这两个语句等价
但是auto* d = 这里必须放指针
注意:1 . auto 语句不能做函数的参数
2. auro 语句不能声明数组 // auto arr[] = { 1,2,,3,3 }; 这样写是错的