写这个系列,是为了回顾 + 总结梳理自己的c++学习。里面的内容可能不会特别详细,但是我对于感觉比较重要的地方会进行详细的说明、理解,能把自己讲董的前提下让看这篇文章的人能够理解我的意思。
目录
1.命名空间
1.1 是什么
命名空间是将标识符的名称进行本地化,是为了防止命名冲突与名字污染。
1.2 怎么用
1.2.1 创建
可以通过关键词 namespace 进行使用。命名空间可以进行嵌套。
namespace DJX
{
int gaoshu = 100;
int Cplusplus = 100;
};
1.2.2 调用
有三种方法: 方法一:使用 using 关键字
using DJX::gaoshu
int main()
{
std::cout << gaoshu << std::endl;
return 0;
}
方法二: 使用" :::作用域标识符
int main()
{
std::cout << DJC::gaoshu << std::endl;
return 0;
}
方法三:使用 using namespace (空间的名称) 实现整体命名空间的访问
using namespace DJX;
int main()
{
std::cout << gaoshu << std::endl;
std::cout << cplusplus << std::endl;
return 0;
}
ps(前提是前面已经进行了DJX 空间定义)
2.引用
2.1 是什么
对于一个变量起另外的一个别名,指向的是同一空间。关键字为 :&(放在类型的后面, 需要跟取地址区分开) 需要注意的是一定一定需要先初始化!!!
2.2 怎么用
2.2.1 使用的场景
1.作为函数参数进行传参
void Swap(int& a,int& b)
{
int c = a;
a = b;
b = c;
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
cout<< a << endl;
cout<< b << endl;
return 0;
}
相当于是给 a ,b变量起了一个别名,指向同一块空间。不需要传地址即可实现交换.
2.作为函数返回值
这可以极大的提高代码运行的效率,但是不注意的也会有一些问题,我将会在后面进行分析。
int& add(int a, int b)
{
static int c = 0;
return c = a + b;
}
int main()
{
int ret = add(2, 1);
cout << ret << endl;
return 0;
}
3.static
有没有注意到代码里面我给 C 加了一个 static ?是将这里的 c 指向的空间变为静态空间,防止因为栈帧对函数开辟空间,在调用完函数之后摧毁空间,导致c无法访问的问题。可能有的同学不太理解为什么?接下来我会通过图解的方式进行分析。
当加上这串代码”printf("Hello DJX");“,同时去掉 static 可以发现 ret 打印的是一个随机数。
同样的在改变为这串代码时,ret 的值也会发生改变。而我们并没有给 ret 赋值。
int main()
{
int ret = add(1, 2);
add(2, 3);
cout<< ret << endl;
return 0;
}
对于这种情况,去掉 static ,函数调用完之后空间不能访问了却还会打印 3,只是由于编译器的问题,编译器不同打印的结果也不相同。
int main()
{
int ret = add(1, 2);
cout << ret << endl;
return 0;
}
4.权限问题
权限只能缩小,不能放大!int& a ,不能够引用 const int b;
3.函数名的重载
3.1 是什么
当函数名相同,但参数的类型不同、不同类型的顺序不同、参数的个数不同时,会发生不一样的效果。
3.2 为什么
这是一道面试官经常会问到的一道题:为什么在 c 语言中函数不能进行重载,但是在 C++ 中却可以?
简单来说,就是在编译时,gcc 和 g++ 的函数命名规则不同。因为在 Linux 下显示简单,我将会使用它进行分析。
众所周知,我们写了一个代码需要通过,预处理(去除注释、头文件展开、宏替换、条件编译)、编译(将代码转化为汇编代码)、汇编(将汇编代码转化为计算机能够看得懂的代码,二进制机械码)、链接(将两个目标文件链接在一起),的操作进行。所以在 gcc 中函数名的命名就是 函数名本身如图所示,但是在 g++ 中函数的命名规则为 _z + 函数名的字数 + 函数名 + 类型的首字母(有几个就加几个)。因此在链接时C++就可以实现重载。
4.参数缺省
必须是从右向左进行定义,缺省。没有参数时自动调用定义的参数 1
int fun(int a, int b = 1, int c = 2)
{
cout<< a << endl;
}
int main()
{
fun(1);
return 0;
}
5.内联函数
5.1 是什么
以空间换取时间 ,当需要频繁调用一个较短的重复函数时,就可以使用 inline 减少频繁调用造成的时间浪费。
5.2 怎么用
直接在前面加上 inline
inline int add(int a , int b);
6.auto
可以自动识别参数的类型,但是数组不能够使用。
7.nullptr
建议将空指针设置为 nullptr 。应为 NULL 反编码是整形 0,并不是 空指针,会存在一些问题。
结尾
如果对你有帮助还请帮我点个免费的赞,支持一下我,我也会不断地改进争取写出跟高质量的文章。我们共同努力!!!!