[C++ 潜心修炼]
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++ 潜心修炼]相关的知识,希望对你有一定的参考价值。
打怪打怪………………
函数重载
在写 C 程序的时候是否遇到过这样的问题,明明功能是一样的,但类型不一样就要特别区分一下,就挺让人恼火的
可能C++之父觉得这样确实麻烦毕竟起名字确实是一个苦力活(玩笑罢了后面有详细的介绍,不过取名字确实累人),所以就有了函数重载
函数重载基本介绍:
在同一个作用域中可以允许函数重名 ,但是
函数的形参必须不同
,且参数个数,类型或者顺序不同就达到要求,那么编译器会根据形参去调对应的函数
正确玩法与断腿玩法
这里就可以看出他上面所说他是根据函数的参数来看判断是否是函数重载
C语言与C++的
- 一个程序运行起来有以下过程,编译,预编译,汇编,链接
如图所示:
而上面只需要知道一个每一个文件里面函数在汇编这个阶段生成一个符号表,然后到链接的时候就会去除无用的符号。
而C语言是根据名字链接的,但是C++和C不同的是他会在名字后面带参数类型,那么就可以根据类型名来进行重载
int Add(int a)
{
}
int Add()
{
}
C++汇编状态下的函数的符号
总的来说就是懒得写交给编译器去分辨哈哈哈
内联函数
宏大家都知道吧,他短小精干,运行效率比函数快(直接替换不在栈上开辟空间),适合处理简单的操作,但是他有一个致命的缺陷就是不可以调试,错了的话需要自己去分析
那么C++就搞了个内联函数,他和宏一样,在调用的时候会被替换(展开),但是他是可以调试的
内联函数的介绍
- 关键字名:lnline
- 用法:在函数前加lnline就可以变成内联函数
- 如果代码量很大 (超过10行),或者是递归,编译器就会忽视,而是把他当作普通的函数,不展开
- 且不要把声明和定义分开写
他内联函数的性质有关,他是在调用的时候展开,那么如果是分开写的话,她就会先找到定义然后展开,根本没时间链接,然后导错误
假设分三个文件写,主文件调用,头文件声明,次文件放声明
记住为什么,就是以为lnline和宏一样是直接替换的,那么找的声明就以为是函数直接展开发现啥也没有
extern"C"
你可能在C++中用C写了一段代码,且需要用C的方式运行那么怎么办呢?,extern"C"在函数面前加这个那么就会调用C的编译器运行这一块代码,类似强制类型转换
auto关键字
auot在C语言中的作用告诉编译器这个变量有生命周期,这不就等于脱裤子放屁一样吗,一般默认前面都是有auto的,所以这个就没啥用,C++对他重新进行了定义
- C++中他的作用就是可以自动推演类型名,类似void指针一样,但是他不需要强制类型转换,编译器自己识别
- 用的比较多的就是一个名字太长了就可以用它(后面STL中一些名名为了可读性会写的很长),和typedef差不多
第一个其实不是我瞎打的她其实是一个单词 [肺尘病]
可能有人会问auot定多了怎么办,我不知道他是啥了,那么有个关键字typeid
auto的一些限制
- 不可以当函数行参
你在给函数开空间的时候auto是啥类型呢,auto是需要根据值来推
- 不可以直接声明数组(她其实不是类型名)
范围for
在for我们心里一定要知道这个数组有多少个元素,以防越界访问,现在有啦范围for那么就非常省力,他会自动推算,且会自动给值
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,0},i;
for( i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
for(int c:arr)//这里如果你不清楚类型是啥可以用auto自动推算
{
cout<<c<<" ";
}
cout<<endl;
return 0;
}
且也可以修改数组中的值但是需要引用,因为前面那个接收数据是临时开辟的,他们俩是毫不相关的一块空间
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,0},i;
for(int& c:arr)//这里如果你不清楚类型是啥可以用auto自动推算
{
cout<<c<<" ";
}
cout<<endl;
return 0;
}
以上是关于[C++ 潜心修炼]的主要内容,如果未能解决你的问题,请参考以下文章