1 命名空间
1-1命名空间的定义
定义命名空间的目的是为了不与标识符的名称进行冲突,命名空间中可以定义函数,变量,类型。
比如:这里的rand和strlens其实是函数,在命名空间中可以避免与全局作用域中的rand函数和strlens函数冲突,其次命名空间还可以嵌套定义
同时一个命名空间定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace bit
{
int rand = 10;
int strlens = 20;
int Add(int a, int b)
{
return a + b;
}
class bit
{
int Sub(int a = 4, int b = 5)
{
return b - a;
};
double _money;
float _lucky;
int _life;
namespace character
{
char* next;
int people;
}
}
1-2命名空间的使用
方法1:加命名空间名称+作用域限定符
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace bit
{
int rand = 10;
int strlens = 20;
int Add(int a, int b)
{
return a + b;
}
class bit
{
int Sub(int a = 4, int b = 5)
{
return b - a;
};
double _money;
float _lucky;
int _life;
}*p;
namespace character
{
char* next;
int people=10;
}
}
int main()
{
cout << bit::character::people<< endl;
return 0;
}
方法2:使用using将命名空间某个成员引入
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace bit
{
int rand = 10;
int strlens = 20;
int Add(int a, int b)
{
return a + b;
}
class bit
{
int Sub(int a = 4, int b = 5)
{
return b - a;
};
double _money;
float _lucky;
int _life;
}*p;
namespace character
{
char* next;
int people=10;
}
}
using bit::Add;
int main()
{
cout << Add(4,5)<< endl;
return 0;
}
方法3:用using namespace将某个命名空间引入
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace bit
{
int rand = 10;
int strlens = 20;
int Add(int a, int b)
{
return a + b;
}
class bit
{
int Sub(int a = 4, int b = 5)
{
return b - a;
};
double _money;
float _lucky;
int _life;
}*p;
namespace character
{
char* next;
int people=10;
}
}
using namespace bit;
using namespace character;
int main()
{
cout <<people << endl;
return 0;
}
2 C++输入和输出
C++的输入输出会自动识别类型,非常方便不像C那样需要printf指定类型输出,其次C++也是需要包含头文件的,输入流cout,输出流cin所需的头文件就是#include<iostream>,<<是流插入运算符,>>是流提取运算符,std是C++标准库的命名空间名,C++将标准库的定义和实现都放在这个命名空间里
3 缺省参数
调用的函数可以存在没有参数,或者参数缺省,下面来给大家示例
void fun(int a = 10)
{
cout << a << endl;
}
int main()
{
fun(2);
fun();
return 0;
}
存在多个参数时,不能隔着缺省,只能从右向左连续缺省
int fun(int a = 10,int b=6,int c = 8)
{
return a + b + c;
}
int main()
{
cout << fun(2, 4) << endl;
cout << fun(4, 4, 4) << endl;
cout << fun(5) << endl;
fun(5);
return 0;
}
4 函数重载
也就是说我可以用相同的函数名,但是参数类型不一样,编译器会自动识别函数参数类型进行相应的匹配
int fun(int a = 10,int b=6,int c = 8)
{
return a + b + c;
}
void fun(char* p, char a, int b)
{
cout << p << endl;
cout << a << endl;
cout << b << endl;
}
int main()
{
char arr[15] = "I love China!";
cout << fun(2, 4) << endl;
fun(arr, 65, 4);
return 0;
}
5 引用
引用也相当于取别名,比如你的名字一样有小名,有大名。
引用的变量其实就是这个变量本身,在语法上其实引用是别名和本名公用同一块空间的,
但是底层逻辑就不是了,底层逻辑就是指针。
int main()
{
int a = 10;
int& b = a;
b = 100;
cout << a << endl;
return 0;
}
6 内联函数
内联函数其实是一种空间换时间的方式,内联函数会在调用它的地方展开,不会开辟函数栈帧,提高了程序的运行效率,但是如果你的内联函数的空间很大很大,那么编译器会自动把它的内联取消定义。
关键字修饰:inline
可以看到下面的汇编代码中根本没有为fun函数开辟栈帧只是调用而已