一.命名空间
在
C/C++
中,变量、函数、类等都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,
以避免命名冲突或名字污染。
定义命名空间,需要使用到
namespace
关键字
,后面跟
命名空间的名字
,然
后接一对
{}
即可,
{}
中即为命名空间的成员。
namespace关键字的出现就是针对上述问题的。
#include<stdio.h>namespace ljk{int a=0;}
命名空间的目的:1.解决与库的冲突2.解决人与人之间的冲突
注意:namespace(命名空间)是定义出一个新域,命名空间中的所有内容都局限于该命名空间中。
#include<stdio.h>
int main()
int a=1;
namespace ljk{
int a=2;
}
{
int a=0;
printf("%d\n",a); // 0
printf("%d\n",::a); // 1
printf("%d\n", ljk::a); //2
return 0;
}
域的顺序:局部域>全局域>展开的命名空间域(暴露在全局域) or 指定访问的域
当上述代码里只有一个
printf("%d\n",a);
最先运行的是局部域里面的。
::a //域作用访问符 第一个“ :”前面如果空白代表全局域的访问
命名空间的使用:
1.加命名空间名称及作用域限定符
int main() { printf("%d\n", ljk::a); return 0; } //这里的ljk表示 namespace ljk
2.使用using将命名空间中某个成员引入
using ljk::b; int main() { printf("%d\n", ljk::a); printf("%d\n", b); //上面已经使用using展开,这里就可以直接写b return 0; }
3.使用using namespace 命名空间名称 引入
using namespce N; int main() { printf("%d\n", N::a); printf("%d\n", b); Add(10, 20); return 0; }
1).直接展开会有风险,我们定义的如果跟库名一样就会报错。
2).建议项目里面不要展开。
3).建议指定访问,不要轻易展开命名空间。
注意:当定义多个命名空间且域名一样时候,就像合并在一个域中,同一个命名空间里变量名冲突就会报错。
二.输入输出
c++的输入输出:
#include<iostream> // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中 using namespace std; int main() { cout<<"Hello world!!!"<<endl; return 0; }
说明:1. 使用 cout 标准输出对象 ( 控制台 ) 和 cin 标准输入对象 ( 键盘 ) 时,必须 包含 < iostream > 头文件 以及按命名空间使用方法使用std 。(std是c++标准库的命名空间名)2. cout 和 cin 是全局的流对象, endl 是特殊的 C++ 符号,表示换行输出,他们都包含在包含 < iostream > 头文件中。3. << 是流插入运算符, >> 是流提取运算符 。4. 使用 C++ 输入输出更方便,不需要像 printf/scanf 输入输出时那样,需要手动控制格式。 C++ 的输入输出可以自动识别变量类型,当做题时候如果想使运作时间简短些,相比之下printf/scanf运行的更快一些。注意:在早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,规定 C++ 头文件不带.h ;旧编译器 (vc 6.0) 中还支持 <iostream.h> 格式,后续编译器已不支持,因此 推荐 使用 <iostream>+std 的方式。
三.缺省参数
缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该 形参的缺省值,否则使用指定的实参。void Func(int a = 0) { cout<<a<<endl; } int main() { Func(); // 没有传参时,使用参数的默认值 Func(10); // 传参时,使用指定的实参 return 0; }
全省参数:
void Func(int a = 10, int b = 20, int c = 30) { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; } int main() { func(); //10 20 30 func(1); //1 20 30 func(1,2); //1 2 30 func(1,2,3); // 1 2 3 }
传参不能跳着传参,传参是从左到右依次传。
半缺省参数:(缺的是部分参数)
void Func(int a , int b = 20, int c=30 ) { cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; } int main() { //func(); 会报错,因为a没有缺省值,所以必须传参 func(1); //1 20 30 func(1,2); //1 2 30 func(1,2,3); // 1 2 3 }
1. 半缺省参数必须 从右往左依次 来给出,不能间隔着给2. 缺省参数不能在函数声明和定义中同时出现3. 缺省值必须是常量或者全局变量4. C 语言不支持(编译器不支持)
四.函数重载
函数重载: 是函数的一种特殊情况, C++ 允许在 同一作用域中 声明几个功能类似 的同名函数 ,这些同名函数的形参列表 ( 参数个数 或 类型 或 类型顺序 ) 不同 ,常用来处理实现功能类似数据类型不同的问题。 (返回值不做要求)
#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
int main()
{
Add(10, 20);
Add(10.1, 20.2);
f();
f(10);
f(10, 'a');
f('a', 10);
return 0;
}
下面的这种构成吗?
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(int b,char a)" << endl;
}
int main()
{
f(1,'w'); //报错
return 0;
}
//这种是不构成的,是类型的顺序不同,不是形参的名字的不同