企业建站系统价格,高级网站开发培训,池州做网站的公司,接单网官网C关键字(C98)命名空间产生背景命名空间定义命名空间使用输入输出缺省参数什么叫缺省参数缺省参数分类函数重载函数重载概念C支持函数重载的原理--名字修饰C关键字(C98)
C总计63个关键字#xff0c;C语言32个关键字。 下面我们先看一下C有多少关键字#xff0c;不对关键…C关键字(C98)命名空间产生背景命名空间定义命名空间使用输入输出缺省参数什么叫缺省参数缺省参数分类函数重载函数重载概念C支持函数重载的原理--名字修饰C关键字(C98)
C总计63个关键字C语言32个关键字。 下面我们先看一下C有多少关键字不对关键字进行具体的了解后面遇到再进行细讲这样更轻松。 命名空间
产生背景 在C/C中变量、函数和后面要学到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化 以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。 #include stdio.h
#include stdlib.h
//rand本来就是stdlib.h里的库函数下面我们自己又定义一个和它同名的变量冲突了
int rand 10;
// C语言没办法解决类似这样的命名冲突问题所以C提出了namespace来解决
int main()
{printf(%d\n, rand);
return 0; }
// 编译后后报错error C2365: “rand”: 重定义以前的定义是“函数”命名空间定义
定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{}中即为命名空间的成员。
// 命名空间的名字可以根据需要自己起
// 1. 正常的命名空间定义
namespace lx
{// 命名空间中可以定义变量/函数/类型int rand 10;int Add(int left, int right){return left right;}注意一个命名空间就定义了一个新的作用域该命名空间中的所有内容都局限于该命名空间中 命名空间可以嵌套
namespace N1
{namespace N2{int a;int b;int Add(int left, int right){return left right;}}
} 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 命名空间使用
下面谈谈命名空间的使用 namespace N
{// 命名空间中可以定义变量/函数/类型int a 0;int b 1;int Add(int left, int right){return left right;}struct Node{struct Node* next;int val;};}
针对上面命名空间N有三种使用方式
1.加命名空间名称及作用域限定符
int main()
{//下面变量a是命名空间N里的变量可以通过 N:a 的方式来使用aprintf(%d\n, N::a);return 0;
}2.使用using将命名空间中某个成员引入
//using N::b 相当于将命名空间N里的变量b和全局作用域连接起来了
//可以像使用普通变量一样使用它
using N::b;
int main()
{//通过 N:a 的方式来使用aprintf(%d\n, N::a);printf(%d\n, b);return 0;
}3.使用using namespace 命名空间名称相当于将整个命名空间和全局域连接起来了这时命名空间就行与名存实亡不起作用了。但上面两种方法还是可以使用。不过已经没必要了。
using namespace N;
int main()
{printf(%d\n, a);printf(%d\n, b);Add(10, 20);return 0;
}std命名空间的使用惯例 在日常练习中建议直接using namespace std即可这样就很方便。using namespace std展开标准库就全部暴露出来了如果我们定义跟库重名的类型/对 象/函数就存在冲突问题。该问题在日常练习中很少出现但是项目开发中代码较多、规模大就很容易出现。所以建议在项目开发中使用像std::cout这样使用时指定命名空间 using std::cout展开常用的库对象/类型等方式。 输入输出
#includeiostream
// std是C标准库的命名空间名C将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
coutHello world!!!endl;
return 0; }使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时必须包含 iostream 头文件以及按命名空间使用方法使用std。cout和cin是全局的流对象endl是特殊的C符号表示换行输出他们都包含在包含 iostream 头文件中。是流插入运算符是流提取运算符。使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动控制格式。 C的输入输出可以自动识别变量类型。 注意早期标准库将所有功能在全局域中实现声明在.h后缀的头文件中使用时只需包含对应头文件即可后来将其实现在std命名空间下为了和C头文件区分也为了正确使用命名空间规定C头文件不带.h旧编译器(vc 6.0)中还支持iostream.h格式后续编译器已不支持因此推荐使用std的方式。 缺省参数
什么叫缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果调用函数时没有指定实参则采用该形参的缺省值否则使用指定的实参。
void Func(int a 0){coutaendl; }int main(){Func(); // 没有传参时使用参数的默认值结果为0Func(10); // 传参时使用指定的实参结果为10
return 0; }缺省参数分类
全缺省参数函数的所有形参全部赋初值调用函数时没有指定任何实参则全部使用缺省参数值。
void Func(int a 10, int b 20, int c 30){couta aendl;coutb bendl;coutc cendl;}半缺省参数函数的部分形参赋初值调用函数时没有缺省的参数必须给与实参值。
void Func(int a, int b 10, int c 20){couta aendl;coutb bendl;coutc cendl;}注意
半缺省参数必须从右往左依次来给出不能间隔着给。缺省参数不能在函数声明和定义中同时出现(如果必须有函数声明和定义那只在函数声明中出现就行) //a.hvoid Func(int a 10);// a.cppvoid Func(int a 20){}// 注意如果声明与定义位置同时出现恰巧两个位置提供的值不同那编译器就无法确定到底该用那个缺省值。缺省值必须是常量或者全局变量。C语言不支持编译器不支持。
函数重载
函数重载概念
函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题。
函数重载分为三类
#includeiostream
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;}C支持函数重载的原理–名字修饰
每个编译器都有自己的函数名字修饰规则就以Windows下和Linux下编译器的名字修饰规则来看Windows下的比较复杂Linux下的比较直观好懂这里我们以Linux下的为例。 通过下面我们可以看出gcc编译器用于C语言的函数修饰后名字不变。而g编译器用于C的函数修饰后变成【_Z函数长度函数名类型首字母】
gcc编译器C语言不支持函数重载因为它的函数修饰规则只看函数名 g编译器C支持函数重载因为它的函数修饰规则不仅仅看函数名 从上图C的名字修饰规则也可以看出函数重载和函数返回值没有关系。
Windows下的名字修饰规则不够直观有个印象就行。