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函数开辟栈帧只是调用而已