目录
2.2展开命名空间域 using namespace bit
规定:缺省值只能在声明部分给缺省值,不能同时给缺省值,否则会冲突。
一.关键字
c++包含c语言的关键字,C++有63个,C语言有32个
二.命名空间
在C语言里,如果出现定义两个名字相同的变量,或者定义一个和关键字相同的变量那么就会出现命名冲突。如:自己定义了一个变量rand,和C语言的关键字rand重复,所以会导致冲突。或者在同一个域里定义同一个变量也会导致冲突。
但是,如果是在不同的域里定义同一变量是可以的。
如下面代码,第一个输出的是局部变量x=1;第二个输出输出的是全局变量0;
这是因为这两个x不在一个作用域,第一个x是在main函数外部是全局变量,第二个x是在main函数里面是局部变量,他们的域不同,所以同名不会导致冲突。
如果要访问全局变量,那么就可以用域作用限定符 ::。
域作用限定符用法::
当限定符左部没有给东西时,默认代表访问全局变量,__::x.
当限定符左边给了作用域时,访问其作用域。
int x = 0;
int main()
{
int x = 1;
printf("%d\n",x); //输出1
printf("%d\n",::x); //输出0
}
2.1命名空间域
如果要在同一个域里定义同一个变量,如想在全员变量域里定义两个x。那么就需要命名空间域。
namespace (域名自己定义)
1. 全局域和局部域会影响生命周期,也会影响访问。
2. 命名空间域不会影响生命周期,只会影响访问。
3. 命名空间域,只能定义在全局。
4. 命名空间域,可以定义变量,结构体,函数,同样也需要指定作用域,命名空间也可以套命名空间。
编译器是先局部后全局
访问命名空间域的变了,在域作用限定符的左部加上域名。就不用再进行先搜索局部,在搜索全局
namespace bit
{
int x = 0; //定义变量
int add(int x,int y){} //定义函数、
}
namespace bit2
{
int x = 1;
}
int main()
{
printf(“%d\n”,bit::x);
printf(“%d\n”,bit1::x);
printf(“%d\n”,bit::add(1,2));
}
特殊情况
对于定义结构体,需要在struct后面加域作用限定符。
struct bit1::node phead;
2.2展开命名空间域 using namespace bit
如果不用using展开,那么在使用这个命名空间域里的变量时就需要用域作用限定符,指定作用域。
但是用using展开,就是相当于将命名空间域的权限放开,相当于将变量等的作用域开放到全局域,不需要::域作用限定符,也不会要指定命名空间。
using namespace bit;
int main()
{
struct QNode node1;//不需要用::限定
}
使用using将命名空间中的某个成员引入
using N::b;
int main()
{
printf("%d\n",b);
printf("%d\n",N::a);
return 0;
}
2.3 头文件#include<iostream>
2.3.1 头文件的展开和命名空间的展开区别
头文件的展开是应为编译器只会编译.c或者.cpp文件,所以要将头文件的内容拷贝到 .c或者.cpp文件,叫头文件的展开。
命名空间的展开的意思是:将命名空间的权限放开,让其内容相当于放入全局域,不用::限定符
2.4 C++的标准的库命名空间std
若要用这个std空间域的东西,可以用两种方法。
方法一:使用展开 using namespace std;//这个方法在实际开发中不推荐
方法二:用::指定std的作用域。
方法三: 只展开命名空间里的某几个变量,using std::count;
2.5 命名空间的套娃
例如如果在实际开发中,一个项目的代码全放在一个命名空间里如bit,那么难免会有函数,变量等充满,那么可以按名字子啊定义一个命名空间。
namespace bit
{
namespace pyf
{
void push()
{
count<<"pyf"<<endl;
}
}
namespace ls
{
void push()
{
count<<"ls"<<endl;
}
}
}
int main()
{
bit::pyf::push();
bit::ls::push();
}
在主函数里调用时,要用两次域作用限定符。
三. C++输入输出
1. <<单独使用是左移符,与C语言一样
2. 如果和cout一起使用,cout<< 是流插入
3.1 流插入cout<<
C++可以自动识别类型的
如cout<<"hello world":就是将"hello world"流入控制台console
3.2 C++换行endl
C++可以写\n,最好写endl
cout<<"hello world"<<endl
3.3 流提取cin>>
四.缺省参数(默认参数)
4.1 全缺省
在形参后面默认一个参数,在实参没有传参时有个默认值
缺省参数的好处是,可以实参只传1个2个,或者不传
但是,实参只能从左往右传,不允许跳跃缺少
不允许跳跃,如
4.2 半缺省 形参必须从右往左给(缺省),也不能跳跃
4.3 缺省的应用场景
一.
我们知道顺序表C语言就需要遇到扩容问题,但是C语言是规定死的扩容一定的量,如扩容100个,但是只需要十个,那么就会导致90个空间浪费。
那么我们C++里面可以给参数n缺省一个值4(可以换其他),那么在入栈时,直接入多少空间的元素,那么就可以开辟多少空间。
4.4 如果是在声明和定义分离的情况
规定:缺省值只能在声明部分给缺省值,不能同时给缺省值,否则会冲突。
五.函数的重载
C语言是不能出现同名函数的。
C++是允许同名函数的,但是不允许参数相同。
而且C++可以自动匹配参数类型。
参数不同一:参数的类型不同
参数的不同二:参数的个数不同
参数的不同三:参数的顺序不同
C++是如何实现重载的
C语言不支持重载的原因是:在链接这个阶段:使用函数名取寻找地址的,所以如果函数名相同,那么会区分不开。
C++:有一套函数名修饰规则,在名字中引入参数,那么就可以区分名字。
例如,下面两个同名函数
void f(int a,char b)
void f(char b,int a)
引入参数规则后:
call _Z1fic(?) //_Z1是默认的,f是函数名,ic是两个参数的类型的首字母缩写
call Z1fci(?)