目录
前言:
命名空间:
总结:
前言:
C语言学好了,现在当然要进阶了,那么就是从C++开始。
C++兼容C,支持其中90%的语法。可能有很多同学听说过C#,C#和C没有关系,是微软研究出来对标Java的语言。
C++有63个关键字。
命名空间:
我们之前使用C语言,其实有很多缺陷,比如从命名开始,就有缺陷,因为在全局变量中,我们不能使用相同的名字,否则会报错,此时我们的本贾尼大佬就开始增强C语言的可读性和实用性,添加了命名空间。举个栗子:
注意此时没有包含stdlib.h头文件,就没有报错。
这是C++文件,因为也支持C语言,当我们包含了stdilib.h头文件以后,就发生了报错。这是因为,我们引用头文件就相当于把头文件展开,stdlib.h头文件中有rand这个全局变量,我们又定义了一个全局变量,所以就会报重定义的错误。
这其实也就是C语言的缺陷。
但是我们知道,一个项目可能由100或更多的人来完成,我们最后都要合并为一个项目,但是我们不可能保证每一个人的命名都不一样。
为了解决这个问题,我们要使用namespace(命名空间)。
#include<stdio.h>
#include<stdlib.h>
namespace bit
{
int rand = 0;
}
int main()
{
printf("%d\n", rand);
return 0;
}
可以发现我们此时打印的是头文件中的rand变量。
但是此时我们就像使用命名空间中的变量该怎么办?不同域可以定义同名变量,但是当我们全局和局部都有相同的的变量名时,我们该如何去访问全局变量呢?
int a = 2;
int main()
{
int a = 1;
printf("局部变量 a = %d\n", a);
printf("全局变量 a = %d\n", ::a);
//此时 :: 前面没有任何语句,相当于默认访问全局变量
return 0;
}
当我们定义了命名空间,在前面加上命名空间名即可访问。
#include<stdio.h>
#include<stdlib.h>
namespace bit
{
int rand = 0;
}
int main()
{
printf("%d\n", bit::rand);
return 0;
}
编译器默认查找规则:1.当前局部域 2.全局变量。
我们可以这样理解,当我们要去地里摘菜时,一定是先去自己家中找(就相当于局部域),之后如果没有了,就去村中野地去找(就相当于全局域);如果还没有,就真的找不到了。
命名空间如果指定,就相当于去隔壁张大爷家的菜地中摘,张大爷指定了可以免费拿。
在一个项目当中,多个文件中允许存在相同的命名空间,当使用时会进行合并。
当命名空间合并以后,就不能有同名的内容了或者嵌套定义才可以。
展开命名空间:
当我们要频繁用到一个命名空间中的一个变量时,就会要写很多代码,此时就需要用到一个语法:using namespace 命名空间名。
这叫做展开命名空间。
namespace bit
{
int c = 0;
}
//展开命名空间
using namespace bit;
int main()
{
printf("%d\n", c);
return 0;
}
当我们展开了命名空间后,此时编译器默认查找规则会多出来一个,就是局部没找到到全局找,全局没找到到展开命名空间找。
但是我们不能随意展开命名空间,比如:
namespace ss
{
int c = 0;
}
namespace bit
{
int c = 0;
}
//展开命名空间
using namespace bit;
using namespace ss;
int main()
{
printf("%d\n", c);
return 0;
}
就像上面,此时就不知道去找谁。
使用命名空间的3种方式:
- 指定访问
- 全展开
- 指定展开某一个
namespace bit
{
int c = 0;
}
//指定展开某一个
using bit::c;
int main()
{
printf("%d\n", c);
return 0;
}
以上就是指定展开命名空间中的某一个。
C++标准库为了防止和你定义的名字冲突,它标准库中的一些东西包在了命名空间中,所以我们还是要指定或者展开。
其中cout就是输出,c是console控制台;endl相当于换行。
#include<iostream>
//IO流
int main()
{
//<< 流插入
int i = 0;
double j = 1.11;
//其自动识别类型
cout << i << " " << j << '\n' << endl;
//其中endl也是换行
return 0;
}
我们需要做出一下修正:
std::cout << i << " " << j << '\n' << std::endl;
这些东西会包在一个std的命名空间中,所以我们要指定命名空间。
此时我们就可以展开官方的std命名空间。
using namespace std;//全部展开并不好
using std::cout;//展开指定某一个
using std::endl;
#include<iostream>
//IO流
using namespace std;//全部展开并不好
int main()
{
int i = 0;
cin >> i;//流提取,不需要取地址
cout << i;
return 0;
}
cin是流提取,相当于scanf但是不需要取地址。
如果我们不习惯,因为C++支持C语言,所以我们也可以使用printf和scanf,但是以后还是建议使用cout和cin。
我们可以发现我们刚才引入的iostream头文件没有加上.h,C++可以不用带.h。当然仅限C++头文件,不包括C的头文件,所以C的头文件还是要带上.h。
缺省参数:
C++支持在函数中提供缺省参数。
using namespace std;
//缺省参数
void Func(int a = 1)
{
cout << a << endl;
}
int main()
{
Func();
Func(2);
return 0;
}
我们也可以提供全缺省函数:
//全缺省
void F2(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
F2(1, 2, 3);
F2(1, 2);
F2(1);
F2();
return 0;
}
必须按照顺序传,不能跳跃着传输。
我们也可以半缺省:
//半缺省
void F3(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
int main()
{
F3(1);//至少要传入一个
F3(1, 2);
F3(1, 2, 3);
return 0;
}
其实缺省参数用处用很多,比如当我们要初始化一个栈时,我们不知道要初始化多大空间时就可以使用官方的值,也可以参入参数。
缺省参数不能声明和定义同时给。
总结:
今天就到这,加油各位!