在C语言学习中,我们会遇到一些问题,比如变量或结构体类型命名冲突,函数名冲突等问题,但是在C++中我们就可以很好的解决这些问题。对C++有些了解的人都知道在写C++程序之前要写:
#includeusing namespace std;
但你知道为什么要写这两句吗?
1.namespace XXX在项目创作的时候,有时会出现命名冲突的问题,C语言没有很好的解决这个问题,除非有一个人让步。C++引入命名空间 namespace 解决这个问题。
#include//在这里有一个函数叫 rand 用于生成随机数,如果在下面还需要定义一个rand的变量就会出现命名冲突的问题 #include //1.命名空间中定义的rand与外面的rand隔离 //2.定义在命名空间中的变量是全局变量,命名空间不会影响生命周期 //3.命名空间的定义: namespa XXX{ }这里没有 分号 //4.命名空间只能定义在全局 namespace lgs // rand在lgs这个名字的命名空间域中 { int rand; } int a; int main() { printf("%dn", rand); //此时打印出来的是rand这个函数的地址 //如果想要使用namespace里的rand: XXX::rand printf("%dn", lgs::rand); int a = 1; //全局优先 printf("%dn",a); //如果想使用全局变量a printf("%dn", ::a); return 0; }
相同名字的命名空间会合成为一个命名空间。当在相同名字的命名空间定义相同的变量或结构的时候又会出现同样的问题。所以解决这个问题的办法就是再套一层。
但每次使用其中的变量的时候都要重复lgs::A::Node/lgs::B::Node非常的麻烦所以就可以
using namespace lgs;这样就不必写lgs
using namespace lgs;
int a;
int main()
{
A::Node* n1 = NULL;
B::Node* n2 = NULL;
return 0;
}
同样的如果:using namespace lgs::A; 释放了lgs::A中的结构体定义,可以直接使用lgs::A中定义的结构体,但是lgs::A并没有命名空间B,所以如果要使用B里的结构体定义就要lgs::B::Node.
Node* n1 = NULL;//用的是lgs::A中的定义 lgs::B::Node* n2 = NULL;
下面代码的意思也就知道了
#includeusing namespace std;
包含一个输入输出流
总结一下:
命名空间能同名,会合并,可嵌套。
有三种使用方式:
1.加命名空间名称及作用域限定符
int main()
{
printf("%dn", N::a);
return 0;
}
2.使用using将命名空间中成员引入
using N::b;
int main()
{
printf("%dn", N::a);
printf("%dn", b);
return 0;
}
3.使用using namespace 命名空间名称引入
using namespce N;
int main()
{
printf("%dn", N::a);
printf("%dn", b);
Add(10, 20);
return 0;
}
2.输入输出
使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含< iostream >头文件以及std标准命名空 间。使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符--%c
#include3.缺省参数/默认参数using namespace std; int main() { int a = 10; double b = 1.0; //流提取 cin >> a >> b; //流插入 cout << a << b << endl; return 0; }
#includeusing namespace std; //函数在没有接收到对应位置的时候默认赋予一个值 void Func(int a = 1, int b = 2, int c = 3) { cout << a << endl << b << endl << c << endl << endl; } int main() { Func(); Func(1); Func(1, 2); Func(1, 2, 3); return 0; }
缺省分为全缺省(全是默认参数)和半缺省(部分有默认参数) 。默认参数的设置必须是从右到左连续。这样的代码在C++中可以通过,但在C中是无法通过的。
void Func4(int a, int b = 2, int c = 2); void Func5(int a, int b, int c = 2);
以下的定义与调用是不被允许的。
缺省参数在栈中的应用:
struct Stack
{
int* a;
int size;
int capacity;
};
void StackInit(Stack* ps, int n = 4)
{
assert(ps);
ps->a = (int*)malloc(sizeof(int) * n);
ps->capacity = n;
ps->size = 0;
}
int main()
{
Stack st;
StackInit(&st);
}
缺省参数定义和声明只出现在声明中一次即可。这是为了避免下面的情况:
声明和定义中的缺省参数不一致
同时不可以声明不给缺省值而定义给,这是因为在编译的时候先使用声明这样可能会出现错误。如:
4.函数重载
在C语言中不支持同名函数,但C++支持。
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
int main()
{
cout << Add(1, 2) << endl;
cout << Add(1.1, 1.2) << endl;
return 0;
}
但是函数重载也是有条件的:
要求函数名相同,参数不同。
参数不同有三种:个数/类型/顺序
#define _CRT_SECURE_NO_WARNINGS 1 #includeusing namespace std; int Add(int a, int b) { return a + b; } double Add(double a, double b,double c) { return a + b + c; } int Add(int a, int b, int c) { return a + b + c; } double Add(int a, double b) { return a + b; } double Add(double a, int b) { return a + b; } int main() { cout << Add(1, 2) << endl; cout << Add(1.1, 1.2,1.4) << endl; cout << Add(1, 2,4) << endl; cout << Add(1.1,2) << endl; cout << Add(1, 2.1) << endl; return 0; }



