局部变量

函数里面的局部变量有普通的局部变量局部静态变量两种。

普通局部变量变量就是正常定义在函数体内部的变量,如果返回局部变量的地址,以便于函数调用结束后还继续访问此变量的话,编译器会报warning,本身这种行为也是错误的,因为函数调用结束后此变量的内存会被释放掉。

局部静态变量会在第一次定义的时候赋给一个初值,之后的调用过程中值会保持原来的值。

例如

int print(){
  static int a = 1;
  printf("%d\n", a++);
}

参数传递

总结出以下几种原则

1.如果是正常传参的话,规则与赋值相等。

2.如果是传引用的话

(1)正常引用传参必须满足匹配原则,例如形参是int,那么传递参数就只能是int,而不能是double或const int。

(2)常量引用传参能够传递所有非常量的匹配的参数,也能传递所有const 类型的匹配参数(如表达式的值,函数的返回结果等。

3.指针传参

具体有const int a, int const a, const int *a

(1)const int a, int const a 正常指针没啥说的。

(2)int * const a, 指针常量,指针指向的地址不能变,但是地址所具有的值可改变。

(3)const int * a,a指针所指向地址能改变,但指向地址的内容不能改变

(4)数组传参如果形参是例如int a[10],传过去的并不是数组,只是指向数组首地址的指针。如果使用memset的话只会让指针指向的位置置零。

  int *matrix[10];         //十个指针构成的数组

  int (*matrix)[10]        //指向含有十个整数的数组的指针

  二维数组传参的时候一定要指定第二维的个数

函数重载匹配规则

具有相同变量名和不同的参数列表的函数叫做重载函数

(1).const T和T不能作为区别两个重载函数的参数

(2)编译器会选择最优匹配的函数调用

最优匹配会经过如下几个步骤

⊙1.确定候选函数

候选函数有两个特征

  ①声明在调用点可见

  ②函数名与调用函数名相同

⊙2.寻找可行参数

可行参数寻找的原则有两点

  ①形参数量与实参数量匹配

  ②形参类型与实参类型相同或能相互匹配

⊙3.寻找最优匹配

最有匹配函数需满足两点

  ①该函数每个实参的匹配都不劣与其他可行参数的匹配

  ②至少有一个实参的匹配优于其他可行参数

  ③如果满足不了以上两点编译器将会判为二义性报错

默认实参

某些函数有这样一些参数,在函数调用的过程中很多次都被赋予同样的值,此时往往把这个参数设为默认参数。

默认参数的写法如下

void print(int a = 1){};

默认参数定义有以下几种规则

(1)某一个参数被赋予了默认值那么之后的参数也要被赋予默认值

默认参数声明有以下几种规则

内联函数

当函数体很短且易展开的时候,我们将函数前面加上一个inline如果能够展开编译器会在编译的时候将函数展开成一个表达式,以节省调用的时间。内联函数是一种建议,编译器可能不会理会。

constexpr函数

当表达式全是由常量组成的时候,在前面加一个constexpr编译器会直接将这个函数变成一个常量,以节省函数调用及计算过程。

函数指针

函数指针指向的是函数而并非是对象

函数指针声明,与声明函数类似,只是将函数名换成指针,写法如下:

void (*a)(double, int);

指向某函数是时方法与赋值类似

a = print;

调用该指针时与调用函数方法类似

a(1., 1);

高放的c++学习笔记之函数基础的更多相关文章

  1. 高放的python学习笔记之基本语法

    python与c++的不同之处 python的语句块不是用{}括起来的而是冒号后面跟一些与比当前语句多一的tab缩进的语句. 1.定义变量 python的变量类型不需要人为指出,会根据赋值的类型决定此 ...

  2. 高放的c++学习笔记之模板与泛型编程

    函数模板 作用 有很多时候参数的类型以及返回值的类型是可变的,我们通过定义模板来让函数能更灵活的运用. 我们设计一个比较函数,如果能比较的两个参数是int型的,两个参数也可能都是string型的,单独 ...

  3. 高放的c++学习笔记之重载运算与类型转换

    ▲基本概念 (1)重载运算符是具有特殊名字的函数,它们的名字又operator和其后要定义的运算符号共同构成.. (2)对于一个运算符号来说它或者是类的成员,或者至少含有一个类类型的参数. (3)我们 ...

  4. 高放的c++学习笔记之类

    类的基本思想是数据抽象和封装1.this 成员函数通过一个名为this的额外隐式参数来访问调用它的对象,当我们调用一个函数的时候,用请求该函数的对象的初始化this. 如果某个类的名字为sale,某个 ...

  5. 高放的c++学习笔记之lambda表达式

    lambda表达式:可以让代码看起来更整洁,有些结构简单且用的次数少的函数可以用lambda表达式替代, 通常结构是这样的[捕获列表](参数列表){函数部分} 捕获列表: lambda表达式如果在一个 ...

  6. 高放的c++学习笔记之关联容器

    标准库提供8个关联容器 按关键字有序保存有(红黑树实现) set map multset 关键字可重复出现的set multimap  关键字可重复出现的map 无序保存 哈希实现 unorderre ...

  7. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  8. matlab学习笔记 bsxfun函数

    matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...

  9. Rancher Server HA的高可用部署实验-学习笔记

    转载于https://blog.csdn.net/csdn_duomaomao/article/details/78771731 Rancher Server HA的高可用部署实验-学习笔记 一.机器 ...

随机推荐

  1. c语言里用结构体和指针函数实现面向对象思想

    一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...

  2. javascript book

    我们很欣喜地看到,在设计模式领域,<JavaScript设计模式>(JavaScript Design Patterns)和<JavaScript编程模式>(JavaScrip ...

  3. 基于单例使用ThreadLocal对多线程下数据的访问修改

    package cn.lyy.thread; import java.util.Random; /** * 基于单例模式的基础上,使用ThreadLocal为每一个进入的线程生成一个实例, * 用来对 ...

  4. Qt for Android 开发大坑123

    http://blog.csdn.net/qyvlik/article/details/50989685 http://blog.csdn.net/qyvlik/article/details/515 ...

  5. First ASP.NET Core Application on a Mac Using Visual Studio Code

    一直希望可以在mac上直接编写webapp (用C#)现在终于伴随着 core 世界美好了,不需要用pd windows了 nice. Visual studio code 更新1.1版本了 怀着激动 ...

  6. COJ 0501 取数游戏(TPM)

    取数游戏(TPM) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取 ...

  7. Yarn应用程序运行流程剖析

    Yarn(Yet Another Resource Negotiator)是一个Hadoop集群资源管理系统,Hadoop2时被引入,旨在提高MapReduce的性能,但YARN已足够通用,使得它可以 ...

  8. HDOJ(HDU) 2090 算菜价(简单水题、)

    Problem Description 妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐.现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵. Input ...

  9. windows server 2003 64x 读取office数据终极解决办法 The 'Microsoft.Jet.OLEDB.4.0' provider is not registered

    微软老子信了你的邪!      试了各种办法没有效果 网友解决办法一: The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the ...

  10. Spice代码阅读一:Spice Client 与 Spice Server 通道建立过程

    文件 方法 描述 Application.cpp init_globals() 初始化Log,ssl库,canvas(或opengl canvas)和quic压缩库 Process_cmd_line( ...