目录
一、命名空间
命名空间定义
命名空间使用
二、缺省参数
三、函数重载
四、extern “C”
C++调用C++静态库或者是C调用C静态库
C++调用C静态库
C调用C++静态库
五、基于范围的for循环
在C/C++中,变量、函数以及类都是大量存在的,这些变量、函数和类的名称也都是存在于全局作用域当中,这会导致我们在写代码的时候,会对这些名称起冲突。
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
在这个命名空间之中,可以定义函数、变量也可以嵌套另外一个命名空间。要是一个项目工程之中,存在多个相同名称的命名空间,编译器最后会合成同一个命名空间。
namespace N2
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N3
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
刚才我们讲解了命名空间的定义,那么定义完命名空间之后,我们又该如何使用命名空间里的变量或者是函数呢?
使用方法有三种:
1、加上命名空间名称及作用域限定符
int main()
{
printf("%d\n", N::a);
return 0;
}
2、使用using将命名空间中的成员引入(这只是命名空间中的某个成员)
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", 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、半缺省参数必须从右往左依此来给出,不能间隔着给
void TestFunc(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
2、缺省参数不能在函数声明和定义中同时出现
3、缺省值必须是常量或者是全局变量
4、C语言不支持(编译器不支持)
函数重载:是函数的一种特殊情况,C++允许在在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
一、包含静态库的头文件
#include
using namespace std;
#include "C:\Users\PC\Desktop\Project2\Project2\Seqlist.h"
int main()
{
return 0;
}
这里我用的是绝对路径。
二、设置项目属性
选择Debug文件
设置附加依赖项
这样一来就成功包含了静态库。
C的程序包含C的静态库也是这样的操作步骤。
这里再多说一下VS2019 如何生成静态库。
一般写好的头文件和与之对应的C文件,运行了之后就会产生lib文件。但是需要设置一下属性。
把应用程序修改为静态库。
这样就可以了生成静态库了。
使用Extern C就可以包含C静态库
#include
using namespace std;
extern "C"
{
#include "C:\Users\PC\Desktop\Project2\Project2\Seqlist.h"
}
int main()
{
SeqList S;
SeqListInit(&S);
return 0;
}
需要在静态库的头文件中,对函数名稍作修改
#ifdef _cpluscplus
extern "C"
{
#endif
// 对数据的管理:增删查改
void SeqCheckAdd(struct SeqList* ps);
void SeqListInit(struct SeqList* ps);
void SeqListDestory(struct SeqList* ps);
void SeqListPrint(struct SeqList* ps);
void SeqListPushBack(struct SeqList* ps, SLDataType x);
void SeqListPushFront(struct SeqList* ps, SLDataType x);
void SeqListPopFront(struct SeqList* ps);
void SeqListPopBack(struct SeqList* ps);
// 顺序表查找
int SeqListFind(struct SeqList* ps, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(struct SeqList* ps, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(struct SeqList* ps, size_t pos);
#ifdef _cpluscplus
}
#endif
#ifdef _cpluscplus
extern "C"
{
#endif
函数名
函数名
#ifdef _cpluscplus
}
#endif
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for (auto& e : array)
e *= 2;
for (auto e : array)
cout << e << " ";
return 0;
}
注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环
for循环迭代的范围必须是确定的,对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
注意:以下代码就有问题,因为for的范围不确定
void TestFor(int array[])
{
for (auto& e : array)
cout << e << endl;
}
这是因为数组被作为函数的形参的时候,被降为了指针。