1.函数调用:实参初始化形参;控制权交给被调函数

2.函数返回(return语句):返回return中的值;控制权交回主函数

3.参数传递

  传值 传引用 传指针
初始值 不变,拷贝给形参

可变,形参是实参的别名

若不想变,加const

拷贝指针给形参
       
//1.传指针
void reset(int *p)
{
*ip=;//改变了指针所指向对象的值
ip=;// 只改变ip的局部拷贝,实参未被改变。指针本身可以在局部内任意变化,但指针指向的值没变
}
int i=;
reset(&i);//改变I的值,而非地址
cout<<i<<endl;//i=0 //2.传引用
void reset(int &i)
{
i=;
}
int j=;
reset(j);//改变I的值,而非地址
cout<<j<<endl;//j=0

4.const参数传递

void reset(int &i)//引用传递
{
i=;
} void reset(int *ip)//指针传递
{
*ip=;
} int i=;
const int ci=i;
string::size_type ctr=; reset(i);//引用传递
reset(&i);//引用传递
reset(ci);//×,int类型不能传递给const int类型
reset(&ci);//×,const in *类型不能传递给int *类型
reset();//×
reset(ctr);//×

如果函数参数是const呢?能接受什么参数传入?

5.数组形参

//三个函数等价,形参是const int*
void print(const int*);
void print(const int[]);//
void print(const int[]);//期望含有10个元素的数组,实际不一定,那实际怎么操作,如果元素>10的话? int i=,j[]={,};
print (&i);//int*类型
print(j);//自动转为int *

5.1 判断数组长度

  1.使用标记(字符串末尾空)

void print(const char*cp)
{
if(cp)
{
while(*cp)//判断方法
cout<<*cp++
}
}

  2.使用标准库

void print(const int *beg,const int *end)
{
while (beg!=end)
cout<<*beg++<<endl;
} int j[]={,};
print(begin(j),end(j));

  3.显式传递大小

void print(const int ia[],size_t size)
{
for (size_t i=;i!=size;i++){
cout<<ia[i]<<endl;
}
}

6.main命令行,传递参数

int main(int argc, //
char *argv[])//argv是数组,元素是char*指针
{
} //与上式等价
int main(int argc,//
char ** argv)//argv  指向char*
{
} prog -d -o file data0//可执行文件prog,输入参数
//argc=5
//argv[0]= "prog";
//argv[1]= "-d";
//argv[2]="-o";
//argv[3]=" file";
//argv[4]=" data0";

7.可变形参

7.1 类型相同,数量不同——initializer_list标准库类型

常量值,无法改变,只读

void error_msg(initializer_list<string> istring)
{
for (auto beg=istring.begin();beg!=istring.end();++beg)
cout<<*beg<<" ";
cout << endl;
} if (expected !=actual)//2 个string 对象
error_msg({"FunctionX output:",expected, actual });//{}用于传递initializer_list序列
else
error_msg({"FunctionX output:","Okay"});

可根据实际改写为先打印错误代码,再打印内容:

void error_msg(ErrorCode e, initializer_list<string> string)
{
cout<<e.print()<<":"
for (const auto & elem:string)
cout<< elles<<" ";
cout<<endl;
}

7.2 省略符形参:varargs标准库

8.函数返回

8.1 不要返回局部对象的引用或指针

8.2 返回数组

1.声明返回数组指针的函数

int (*func(int i))[];//解引用的结果是一个10个int元素的数组
//func(int i):
//(*func(int i)):对函数调用的结果解引用
//

2.尾置返回?

auto func(int i)->int(*)[];

3.decltype返回?

int odd[]={,,,,};
int even[]={,,,,};
decltype (odd) *arrptr(int i)//decltype不会把数组转为指针
{
return (i%)?&odd:&even; //返回一个指针,该指针指向含有5个整数的数组
}

9.函数重载

9.1.不能定义两个除了返回值类型不同外,其他都相同的函数

9.2 有时候两个形参看起来类型不一样,实际上相同,也是不许的

9.3 带顶层const的形参和不带const的形参是无法区分的

bool lookUp(Phone);//
bool lookUp(const Phone);//2,与1重复。/?
bool lookUp(Phone*);//
bool lookUp(Phone* const);//4,与3重复。/? bool lookUp(Phone&);//5,作用于Phone的引用
bool lookUp(const Phone&);//6,作用于常引用,同时存在会优先选用
bool lookUp(Phone*);//7,作用于指向Phone的指针
bool lookUp(const Phone *)//8,作用于指向常量的指针,同时存在会优先选用

10.默认实参:一旦有一个参数为默认,其他必须给默认值

string screen(size_type hight=, size_type width=);

window=screen();
window=screen(100,200);

11.内联函数

1.定义在头文件中(文件中多次要用)

12.constexpr函数

1. 函数的返回类型、形参类型都是字面值类型

2.函数中有且仅有一条return语句

3.定义在头文件中

constexpr int new_size()
{
return ;
} constexpr size_t scale(size_t cnt)
{
return new_sz()* cnt;
} int arr[scale()];

13.函数调用时的实参匹配

1.精确匹配

2.const转换实现匹配

3.类型提升实现匹配

4.算术类型转换(或指针转换)实现匹配

5.类类型转换实现匹配

bool lookUp(Account &);
bool lookUp(const Account &); Account b;
lookUp(b);//两个都可以调用,但是第一个优先

14.函数指针

bool lengthCompare(const string &,const string &);

bool (*pf)(const string &,const string &);//pf是指向函数的指针
//bool *pf(const string &,const string &);//声明一个名为pf的函数,返回bool * pf = lengthCompare;
pf =& lengthCompare;//与上等价 bool b1=pf("hello","goodbye");
bool b2=(*pf)("hello","goodbye");
bool b3=lengCompare("hello","goodbye");//三式等价

14.1 返回指向函数的指针

14.2 auto 和decltype用于函数指针类型

C++——函数及调用的更多相关文章

  1. Direct3D Draw函数 异步调用原理解析

    概述 在D3D10中,一个基本的渲染流程可分为以下步骤: 清理帧缓存: 执行若干次的绘制: 通过Device API创建所需Buffer: 通过Map/Unmap填充数据到Buffer中: 将Buff ...

  2. Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数

    11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...

  3. JS中函数的调用和this的值

    调用每一个函数会暂停当前函数的执行,传递控制权和参数给新函数.除了声明时定义的形式参数,每个函数还接收两个附加的参数:this 和 arguments. 参数this在面向对象编程中非常重要,他的值取 ...

  4. jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

    jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法   在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...

  5. LR自定义函数以及调用

    2.2.自定义函数以及调用 2.2.1.虚拟用户编程,使用C# 语言DLL 在VS中建立DLL类库项目,编写函数时使用public声明:实现函数后编译生成DLL: 在LR中建立 .Net Vuser脚 ...

  6. LR常用函数以及调用自定义函数

    2.LR常用函数以及调用自定义函数 2.1.LR常用函数以及对信息的判断 2.1.1. LR内部自定义函数 在LR脚本中定义变量和编写自定义函数,需将变量的声明放在脚本其他内容的上方,否则会提示[il ...

  7. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  8. 【C语言入门教程】5.3 函数的调用 与 参数

    函数通过调用获得程序的控制权,函数的参数是调用者与函数的数据接口.函数可以定义一个或多个参数,也可以省略参数,调用时将与参数的数据类型相匹配的数据置于参数列表中,即可在函数体内使用.参数的调用有多种形 ...

  9. python 函数的调用 和执行 小知识

    1.符号表 执行一个函数会引入一个用于函数的局部变量的新符号表. 更确切地说, 函数中的所有的赋值都是将值存储在局部符号表: 而变量引用首先查找局部符号表, 然后是上层函数的局部符号表, 然后是全局符 ...

  10. probe函数何时调用的

    转自:http://blog.csdn.net/xiafeng1113/article/details/8030248 Linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名 ...

随机推荐

  1. Windows环境下Oracle数据库的自动备份脚本自动删除30天前的备份

    @echo off echo ================================================ echo Windows环境下Oracle数据库的自动备份脚本 echo ...

  2. NIO浅析(二)

    一:前言 在(一中了解了NIO中的缓冲区和通道),通过本文章你会了解阻塞和非阻塞,选择器,管道 二:完成NIO通信的三要素 * 1.通道(Channel):负责连接* java.nio.channel ...

  3. servlet项目找不到java文件(由于照抄代码造成的bug)

    其实这个bug非常简单,实际上是由于路径配置问题,也是由于我照抄代码造成的(好孩子不要学!) 情况是这样的:java文件没有问题但是启动项目的时候出现了bug: 然后当我把GetData.java和J ...

  4. Java内部类类型

    可以在类中的任何位置定义内部类,并在其中编写Java语句.有三种类型的内部类. 内部类的类型取决于位置和声明的方式. 成员内部类 局部内部类 匿名内部类 成员内部类 成员内部类在类中声明的方式与声明成 ...

  5. Struct和Union的sizeof计算

    struct 结构体的大小不是简单的成员相加,要考虑存储空间的字节对齐 1.空结构体的大小为1 2.含有static的结构体在计算大小时不算上static变量,因为static存储在全局数据空间,而s ...

  6. mysql 密码

    http://www.cnblogs.com/jonsea/p/5510219.html character-set-server=utf8 mysql 修改密码: ALTER USER 'root' ...

  7. 学习Spring时用Idea中Maven Project创建一个子module出现了子pom.xml没有继承父pom.xml

    正常情况: 解决方法: 1.首先点击父项目右键 -->new-->Module 2.不用点击create from achetype直接点击next 3.在ArtifactId输入你要mo ...

  8. Linux部署web项目

    一.软件1.putty2.WinSCP 二.调试1.linux 下 apache启动.停止.重启命令基本的操作方法:本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合 ...

  9. 聊聊redis实际运用及骚操作

    前言 聊起 redis 咱们大部分后端猿应该都不陌生,或多或少都用过.甚至大部分前端猿都知道. 数据结构: string. hash. list. set (无序集合). setsorted(有序集合 ...

  10. esxi主机用命令行强行关闭通过前端界面无法关闭的ESXI虚拟机

    环境:esxi5.1-esxi6.5 背景:如果esxi下面某一台vm死机了,并且esxi的控制台卡死不能用,为了不影响同一个esx下其他的vm正常使用,那么我们只能用命令行来单独重启此vm,保证一定 ...