公司制作个网站,图片素材网站排行榜,对整个网站做词频分析,新加坡室内设计公司排名C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言
在学习C之前首先我们要知道—C是在C的基础之上容纳进去了面向对象编程思想并增加了许多有用的库以及编程范式等。这篇文章可以帮助我们了解c是如何
补充C语言语法的不足以及C是如何对C语言设计不合理的地方进行优化的。为后续类和对象学习打基础。
一、命名空间
随着c语言的不断发展和完善C语言库函数和关键字的定义越来越多这些变量、函数和类的名称将都存在于全局作用域中而在我们编写程序时定义的函数、变量有时就会和库中所定义的发生冲突如
#include stdio.h
#include stdlib.h
int rand 10;
// C语言没办法解决类似这样的命名冲突问题所以C提出了namespace来解决
int main()
{printf(%d\n, rand);return 0;
}注这里的报错就是因为在库中有一个rand()函数与我们定义的rand变量名字冲突了。 C语言没有办法很好的解决这类问题c便提供了命名空间的方法命名空间的目的是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。 命名空间定义 定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{}中即为命名空间的成员如
namespace ltn
{// 命名空间中可以定义变量/函数/类型int rand 10;int Add(int left, int right){return left right;}
}
注意一个命名空间就定义了一个新的作用域命名空间中的所有内容都局限于该命名空间中现在命名冲突的问题我们解决了但是当你尝试对类中的函数进行调用时又会出现问题如
namespace ltn
{int rand 10;int Add(int left, int right){return leftright;}
}
int main()
{Add(1, 1);return 0;
}这是因为对于这个命名空间中所定义函数、变量等我们是不可以直接访问的需要配合“”域作用符指定域来进行访问如
namespace ltn
{int rand 10;int Add(int left, int right){return leftright;}
}
int main()
{printf(%d\n, ltn::rand);ltn::Add(1, 1);return 0;
}如果我们不指定域编译器首先会去局部查找其次会去全局域查找并不会去我们所定义的命名空间中查找这一点会在后面验证。 在我们编写c代码时往往会在代码中编写这样一段代码“using namespace std;”这里的std就是我们标准库所在的域而这句代码的意思就是将这个命名空间展开权限放开使我们在使用库中定义的函数、关键字时不在受域限制我们可以通过自己定义的命名空间来验证这里的问题如 在不指定命名空间时程序是无法编译的接下来我们展开ltn这个命名空间
#include stdio.h
#include stdlib.h
namespace ltn
{int rand 0;int Add(int left, int right){return left right;}
}
int main()
{Add(1, 1);return 0;
}对上面个这中情况我们如果展开命名空间rand变量就会和库中的rand函数冲突如果不展开每次都要指定域访问又有点麻烦这时我们就可以将 命名空间中我们经常使用的函数、变量具体引如
还以一点当我们在两个不同的文件中定义了相同的命名空间他们是会自动合并的例
namespace ltn
{int add(int x,int y){printf(add\n);return 0}
}在test.h文件中定义一个和test.c相同的命名空间这是我们只需要将test.c中的命名空间展开test.h命名空间中的add函数一样可以使用。
二、缺省参数
2.1、缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。
void Func(int a 0)
{coutaendl;
}
int main()
{Func(); // 没有传参时使用参数的默认值Func(10); // 传参时使用指定的实参
return 0;
}2.2、 缺省参数分类
2.2.1、全缺省参数
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();cout ----------------- endl;Func(1);cout ----------------- endl;Func(1,2);cout ----------------- endl;Func(1,2,3);return 0;
}但我们使用全缺省时我们可以选择性给函数传递数据。
2.2.2、半缺省参数
void Func(int a, int b 10, int c 20)
{cout a a endl;cout b b endl;cout c c endl;
}
int main()
{Func(1);cout ----------------- endl;Func(1,2);cout ----------------- endl;Func(1,2,3);return 0;
}半缺省函数需要注意的是
半缺省参数必须从右往左依次缺省不能间隔着给半缺省参数在调用是我们传递的参数是从左到右依次匹配的
2.3、缺省参数的特点
1、缺省参数不能在函数声明和定义中同时出现 语法规定当我们对函数进项声明和定义分离时缺省参数不可同时存在如果同时存在而两个位置提供的值不同那编译器就无法确定到底该用哪个缺省值。 2、 缺省值必须是常量或者全局变量 这个大家自己验证吧。
三、函数重载
3.1、函数重载概念
函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题
3.2、构成函数重载的条件
构成重载的函数在调用时编译器会根据我们传递的参数匹配调用合适的函数。
3.2.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;
}
int main()
{Add(1,1);Add(1.1, 1.2);return 0;
}程序执行时编译器自动匹配合适的函数进行调用。
3.2.2、参数个数不同
void f()
{cout f() endl;
}
void f(int a)
{cout f(int a) endl;
}
int main()
{f();f(1);return 0;
}这里要注意的是我们上面提到的缺省参数如果像下面这样使用会造成二义性的问题
3.2.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()
{f(10, a);f(a, 10);return 0;
}
至于c是如何支持函数重载的大家感兴趣可以搜一下c中函数名命名规则。