文章目录
- 1.命名空间namescape
- 1.1命名空间namescape定义
- 1.2命名空间namescape规则
- 2.2 命名空间使用
- 3 C++输入&输出
- 4. 缺省参数
1.命名空间namescape
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”
1.1命名空间namescape定义
定义命名空间格式 :
namescape(关键字) name(命名空间名) { }
命名空间内容:
// 1. 正常的命名空间定义
namespace Lvision
{
// 命名空间中可以定义变量/函数/类型/结构体
int rand = 10;
int Add(int left, int right){return left + right;}
struct Node{struct Node* next;int val;};
}
1.2命名空间namescape规则
- 在同一个文件中, 可以定义相同名字的命名空间 , 但不能有相同名字的变量
同一作用域下,定义了相同的变量名就会报错: error C2374: “Lvision::a”: 重定义;多次初始化
- 命名空间允许嵌套
- 同一个工程中,允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// test.h
namespace N1
{
int Mul(int left, int right){return left * right;}
}// test.cpp
namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}
一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
2.2 命名空间使用
namespace bit
{// 命名空间中可以定义变量/函数/类型
int a = 0;
int b = 1;
int Add(int left, int right)
{return left + right;
}
struct Node{struct Node* next;int val;};
}
int main()
{
// 编译报错:error C2065: “a”: 未声明的标识符 如何使用a?
printf("%d\n", a);
return 0;
}
命名空间的使用有三种方式:
- 加命名空间名称及作用域限定符 ::
int main()
{
printf("%d\n", N::a); //使用命名空间N中的a
return 0;
}
- 使用using将命名空间中某个成员引入
using N::b; //至扩展出N里b的变量, N里其他的变量不扩展
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;
}
- 使用using namespace 命名空间名称 引入
using namespce N; // 扩展出N中所有的变量
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
3 C++输入&输出
#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{cout<<"Hello world!!!"<<endl;return 0;
}
- 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含 iostream 头文件
以及按命名空间使用方法使用std。- cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含iostream 头文件中。
- <<是流插入运算符,>>是流提取运算符。
- 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。- cout和cin分别是ostream和istream类型的对象。
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应
头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,
规定C++头文件不带.h;旧编译器(vc 6.0)中还支持< iostream.h >格式,后续编译器已不支持,因此推荐使用< iostream >+std的方式。
4. 缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。
void Func(int a = 0)
{cout<<a<<endl;
}
int main()
{Func(); // 没有传参时,使用参数的默认值 也就是 a = 0Func(10); // 传参时,使用指定的实参 也就是 a = 10return 0;
}
注意:
1. 缺省函数的缺省参数只能从右往左,也就是缺省参数不能在实参前面,
//允许
void Func(int a = 10, int b = 20, int c = 30)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}//允许
void Func(int a , int b = 20, int c = 30)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}//不允许
void Func(int a = 10, int b , int c = 30)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}
- 缺省值必须是常量或者全局变量
- C语言不支持(编译器不支持)