这里写目录标题

  • 前言
  • 命名空间
  • 缺省参数
    • 1、**什么是缺省参数**
    • 2、缺省参数的分类
      • 注意事项
  • 函数重载
    • 1、形参不同
    • 2、形参顺序不同
    • 3、形参个数不同
    • 为什么会出现上述这样的情况呢??
    • gcc上的函数修饰,只是简单取函数名
    • g++上的函数名,通过_Z+函数名的长度+函数名+类型的首字母(按照参数顺序)
    • g++上面的函数名修饰规则在加入类型之后,能够很好区分在函数名相同时,通过参数类型、顺序以及个数从而达到区分函数,注意!!函数返回值没有参与函数名修饰规则当中,所以不能用返回值来区分函数。
  • 引用
    • 什么是引用
    • 怎么使用引用
      • 1、做参数
      • 2、做返回值
    • 引用底层实现
    • 引用与指针的不同点
  • 内联函数
    • 为什么会有内联函数
    • 内联函数使用
    • 内联函数的特性
      • 声明和定义分离时候的报错。
  • auto
    • auto注意事项
    • 范围for

前言

从这边开始我们正式朝C++前进了。在C语言中有着许多不合理的地方或者是不舒服的地方,比如作用域、宏函数、指针等地方,于是C++在C语言的基础上进行调整,出现许多让我们程序猿舒服且比较好理解的地方。那我们就开始吧。

命名空间

在以前C语言的学习中,我们发现使用相同的名字来命名变量之类,会出现报错,这让我们很烦恼,这万一以后要是命名与库函数里面的东西重名,出现报错,难道我们需要找到写库的作者辩论辩论吗?凭什么就你用了那个名字之后我不能用呢,为了解决这个问题,于是C++引入了命名空间的概念:使用关键字 namespace 后面自己取个名字。例如:

namespace im
{int rand = 9;//...
}

接下来创好命名空间我们要怎么使用呢
有三种方式,这边我以std为例,原来标准库在引入命名空间之后也是被放到namespace std

指定作用域:std::cout;
全局展开: using namespace std;
部分展开:using std::cout;

缺省参数

1、什么是缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
void Func(int a = 0)
{int c = a + 5;
}
int main()
{Func(); // 没有传参时,使用参数的默认值Func(10); // 传参时,使用指定的实参return 0;
}

2、缺省参数的分类

缺省参数还分全缺省和半缺省
全缺省

void Func(int a = 10, int b = 20, int c = 30)
{//...
}

半缺省

void Func(int a, int b = 20, int c = 30)
{//...
}

注意事项

1、在半缺省中缺省值必须从右向左给,不能有隔着给。
下面是错误示范

void Func(int a = 10, int b , int c = 30)
{//...
}

2、在定义和声明分离时,缺省参数只能放在声明,定义不用写。


函数重载

这是c++相比c语言很舒服的一个地方,支持在同一个作用域中有功能类似的同名函数,可以是形参类型不同或者顺序不同或者形参个数不同。

1、形参不同

int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}

2、形参顺序不同

void f(int a, char b)
{cout << "int char" << endl;
}
void f(char b, int a)
{cout << "char int" << endl;
}

3、形参个数不同

void func()
{cout << "无参" << endl;
}
void func(int a)
{cout << "有参" << endl;
}

为什么会出现上述这样的情况呢??

原因在于函数名修饰上面,这边由于因为vs上的函数名修饰规则比较复杂,不易观察,我用Linux上的gcc g++举例

gcc上的函数修饰,只是简单取函数名

g++上的函数名,通过_Z+函数名的长度+函数名+类型的首字母(按照参数顺序)


g++上面的函数名修饰规则在加入类型之后,能够很好区分在函数名相同时,通过参数类型、顺序以及个数从而达到区分函数,注意!!函数返回值没有参与函数名修饰规则当中,所以不能用返回值来区分函数。


引用

什么是引用

在语法上,引用可以理解为给变量取别名,实际代表的是变量本身。比如爱情公寓中的张伟,有各种小名,张益达、张大炮、snake,但无论叫哪个名字,都是指张伟这个人。在C++中 用&表示引用。通常加在类型后。

int i = 0;
//类型& 引用变量名& = 引用实体
int& j = i;

怎么使用引用

1、做参数

int Add(int& x, int& y)
{return x+y;
}

2、做返回值


int m = 1;int& multi ()
{m *= 2;return m;
}

这时候出现个问题,以下的代码可不可行

int& add(int x, int y)
{int sum = x + y;return sum;
}

显然是不行的,因为sum是局部变量,出了作用域就销毁了还给操作系统,而引用是返回sum本身,这时候已经不属于你的,这时候你再使用这块空间是不安全,里面值可能没有改变,也可能改变了,取决于操作系统。

引用底层实现

刚刚接触引用,可能感觉挺神奇的,会拿其与指针对比,突然觉得c语言中的指针好麻烦,这个引用简单,且用起来很舒服。比如函数传指针的时候,你需要去解引用,而引用不需要传指针,直接修改。

//c语言版本
void func1(int* pi)
{*pi = 4;
}void func2(int& a)
{a = 5;
}int main()
{int i = 0;int* pi = &i;func1(pi);func2(i);return 0;
}

让人惊奇的时候实现引用是通过指针实现。汇编指令完全相同,可以证明引用底层是通过指针实现的。
所以引用从本质来说,与指针没有什么差异,但是使用上比指针舒服很多,可以说是编译器帮你把这脏活给包揽了。

引用与指针的不同点

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

内联函数

为什么会有内联函数

在C语言中大家想必体会过宏函数的麻烦之处了吧,一不小心就容易出错
例如下面add宏函数,在x、y要加括号,在最外面还要加括号。一旦不小心少了一个括号,会出现不少问题。而且宏还有其他问题:

  1. 不能调试,只是单纯的替换。2. 没有类型检查。

因此为了代替宏,C++弄出了内联函数

#define Add(x, y) ((x)+(y))

内联函数使用

在函数前面加上inline关键字来修饰函数,在预处理阶段中对内联函数进行展开,而不是跟正常函数一样,在编译过程转换成call指令在链接的时候通过函数地址从而调用函数。

内联函数的特性

1、减少了栈帧的开销,文件空间增大,经典空间换时间,但是如果是递归之类的函数,或者过大的函数,使得消耗空间过大,编译器会忽略掉inline,当成正常函数来调用,所以对于编译器来说,inline只是一个建议而已。
2、内联函数声明和定义无法分离。
原因是在编译的时候内联函数已经展开了 声明定义分离之后 编译过程中只有函数声明 没办法展开 只能等待进入链接环节 拿着修饰过的函数名 需要去符号表找相应地址 进行链接 而内联函数地址不会进到函数表里 会出现链接失败的情况

声明和定义分离时候的报错。

auto

在C语言中,如果一个类型太长,我们一般需要采取typedef 缩短类型长度,例如typedef struct ListNode LNode, 而在C++当中,则是弄出了auto,是一个自动推导变量类型的"占位符",原因是编译器在编译时候就将其替换掉,因此他不是类型声明,相当于占位,把这个活交给编译器来干。程序猿使用的时候方便很多,但不是十全十美的,会使可读性下降,不好理解该变量的类型。

auto注意事项

1、用auto声明的变量必须初始化,因为编译器通过初始化的值从而推导该变量的类型。
2、形参无法推导类型。
3、不能推导数组类型。
4、auto* 与 auto没有区别,但是引用的话必须要需要在后面加上&
5、在同一行声明多个变量需要保证全部变量是同一类型。


范围for

在C语言当中,我们遍历数组之类的,需要for循环来遍历,需要确定从什么时候开始,不满足什么条件时候停止,有时候在确定范围上容易出错,在C++11引入一个范围for,也叫语法糖,使用方法如下

int arr[]={1,2,3,4,5,6};
for(auto a:arr)
{//...这里与for循环一样使用
}

可以用continue,break进行操作。
范围是确定的,否则会出现问题。

C++入门:命名空间、缺省参数、函数重载、引用、内联函数、auto、范围for相关推荐

  1. C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性

    C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...

  2. 函数模板、 内联函数

       函数重载就是有相同的函数名但参数的个数或类型不同从而根据不同的参数个数和参数类型来调用相应的方法.    我们发现函数重载只是解决了函数命名的问题,但函数体虽然相同我们还是要重复的写,为了解决这 ...

  3. C++学习笔记之——引用 内联函数

     本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者 ...

  4. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  5. C++中虚函数可以是内联函数吗?

    1.需要注意的几点: 虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联. 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因 ...

  6. C++的内联函数和非内联函数的区别

    一.内联函数和非内联函数的定义 1.内联函数 inline void test(); void test() { cout<<"test"<<endl; } ...

  7. inline 内联函数详解 内联函数与宏定义的区别

    一.在C&C++中 一.inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionName ...

  8. 【C++入门】函数重载,引用,内联函数......

    目录 命名空间 C++的输入与输出 缺省参数 函数重载 引用 内联函数 auto关键字 命名空间 在C++的学习过程中,比起C语言,C++有着更多的函数,关键字等等,但是他们都存在于全局作用域中,就可 ...

  9. C++ 基础 : 函数重载、引用、内联函数、auto、范围for循环

    函数重载 引用 内联函数 auto 范围for循环 函数重载 C++中引入了一个新特性,函数重载. 在同一个作用域下,对于相同的函数名,函数的参数不同,不同类型的参数顺序不同,参数的个数不同,都可以形 ...

  10. 超详细的C++入门学习(命名空间,缺省参数,内联函数,函数重载等)

    目录 前言 1. C++关键字 2. 命名空间 2.1定义命名空间 2.2使用using将命名空间中某个成员引入 2.3使用using namespace 命名空间名称 引入 3. C++输入& ...

最新文章

  1. 为什么百度只收录我的网站首页?
  2. mysql事务隔离级别与具体实例
  3. 9.动态生成实体类,根据XML模板使用Emit生成动态类绑定到DataGrid
  4. 如何在电脑中使用python_教你怎么在windows上用python获得CPU信息
  5. (二)win7下用Intelij IDEA 远程调试spark standalone 集群
  6. c++vector(入门级)
  7. python程序开发入门_程序设计入门—Python
  8. BZOJ4530[BJOI2014] 大融合
  9. 计算机环境变量怎么恢复默认,环境变量怎么还原
  10. 杆刚度校核c语言程序,第12章杆件的强度、刚度计算.doc
  11. CF#446 Gluttony(思维题)
  12. 用Fiddler做抓包分析详解
  13. Android10.0 startService启动过程
  14. 基于Jenkins搭建iOS持续集成开发环境
  15. Quasi- likelihood function
  16. 计算机类研究生双证,想要报考计算机专业来攻读双证在职研究生最终是不是可以获得双证...
  17. java百万级大数据量导出
  18. WaveDrom的使用
  19. Coad和Yourdon面向对象的分析过程
  20. 即将走出实验室的6大IT创新

热门文章

  1. MATLAB实现数图的缩放:双线性内插法
  2. 分享mac主机通过虚拟机中parallels连接内网
  3. 这个中秋最潮酷玩法,必须mark!
  4. C++ 12 翁恺> const
  5. 「APIO2016」划艇 (dp+组合数+区间离散化)(考试)
  6. C语言”%p”的意思
  7. Andorid Studio 制作欢乐写数字(Timer启动+帧动画,Android开发面经分享
  8. 视频flv怎么转换成mp4?
  9. 佳明手表同步失败显示服务器错误,解决佳明表盘设置无法同步
  10. 【Python深度学习】基于Tensorflow2.0构建CNN模型尝试分类音乐类型(二)