#include<iostream>//c++的输入输出
using namespace std;
//使用命名空间语法:using namespace 空间名称;
//将空间中的所有成员全部展开到此程序中
//using 空间名称::成员;//将空间中的某一个成员展开
//namespace U1 {
// int x = 10;
// const int y = 20;
//
//}
////main函数外部(全局)using名字空间,则名字空间中的成员全为全局
//using namespace U1;
//int main()
//{
// cout << x << endl;
// const int* p = &y;
//}
//namespace 名字空间
//作用:解决名字标识符可重用的问题
//namespace定义语法:namespce 名字{...}
//在namespace名字空间中,可以定义变量,常量,函数,类...
//同一个名字空间可以重复定义空间,但成员不能重定义
//编译器对于同一个名字空间编译时,会自动合并到一起
//namespace User1 {
// double PI = 3.1416;
// int add(int a)
// {
// return a + 100;
// }
//}
//namespace User2 {
// double PI = 3.1415927;
// int add(int a)
// {
// return a + 10;
// }
//}
//int main()
//{
// //访问名字空间中的成员
// //语法:空间名称::成员
// cout << "精度低的PI" << User1::PI << endl;
// cout << "精度高的PI" << User2::PI << endl;
// cout << User1::add(100) << endl;
// cout << User2::add(10) << endl;
// return 0;
//}
//函数模版:定义时以泛型替代实际类型,在调用时具体化
//函数模版也是函数重载的体现 每一个具体化都是函数的重载
//函数模版的语法(在函数上方去定义):template<typename|class 名字>
//函数模版在定义泛型时可以同时定义多个泛型使用,分割
/*template<class T1,class T2,class T3>
T3 sub(T1 a, T2 b) { return a - b; }
double ret = sub<short, int, double>(10, 20);*///需要手动指定泛型的具体化类型名
//template<class T>
//T add(T a,T b) { return a + b; }
//int main()
//{
// cout << add(1, 2) << endl;//T具体化为int
// cout << add(1.25, 2.4) << endl;//T具体化为double
// cout << add<float>(1.25, 2.4) << endl;//调用时可以指定T的类型
// return 0;
//}
//template<class T1,class T2>
//T1 mul(T2 a, T2 b) { return a * b; }
//short ret1 = mul<short, char>(10, 20);
//int ret2 = mul<int, short>(10, 20);
//double ret3 = mul<double, int>(10, 20);
//右值和左值引用 右值引用可以构造函数重载
//值类别:左值 右值
//左值:具名(有名字),可取地址(有自己的存储空间) 如普通变量 指针变量
//右值:不具名,不可取地址 如常数,表达式
//左值引用:对左值的引用
//右值引用:对右值的引用 但常引用认为左值引用
//int main()
//{
// int a = 10;//右值
// int b = a + 10;//左值
// int& ar = a;//ar是左值引用
// const int& r1 = 10;
// const int* p = &r1;//r1左值引用
//
// //右值引用的语法 数据类型&&引用名=右值
// int&& r2 = a > 5 ? a - 5 : a;
// int&& r3 = 10;
// //r2 r3是左值
// return 0;
//}
////在c++编译器中写c程序如何让函数名进行粉碎
////将函数定义或声明放在 extern"C++"{}
//extern "C++"
//{
// int add(int a, int b)
// {
// return 0;
// }
//}
//
//int main()
//{
// add(1, 2);
// return 0;
//}
//如何让函数不进行名字粉碎?
//使用extern "C"{},将函数定义到此语句块中即可
//extern "C" {
// int __cdecl add(int a, int b);
//}
//
//int main()
//{
// cout << add(1, 2) << endl;
// return 0;
//}