C++Premer Plus学习(五)——函数探幽
一、内联函数
1、优点:
内联函数就是比较省资源,然后一般就是将简短,使用频率高的函数作为内联函数会比较合适。
2、一个demo
#include "stdafx.h"
#include<iostream> using namespace std; inline double Square(double x) { return x*x; } int _tmain(int argc, _TCHAR* argv[])
{
int a = 16;
cout << Square(334);
}
二、引用变量(别名)
1、创建引用变量
C和C++使用“&”符号来表示指示变量的地址。但C++中“&”还表示声明引用
int rat;
int © = rat;
声明引用变量的时候必须进行初始化,一定要的。
2、将引用用作函数的形参
直接将实参和形参进行关联起来,即类似于同一个人的不同名字。所以进行对形参的修改会导致实参一样跟着变化,因为两者本就是一体。
3、尽可能使用const
4、将引用作用于结构
// Exercise.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream> using namespace std; struct sysop
{
char name[26];
char quote[64];
int used;
}; const sysop & use(sysop & sysopref); int _tmain(int argc, _TCHAR* argv[])
{
sysop looper =
{
"Rick \"Fortran\" Lopper",
"I'm a goto kind of guy.",
0
}; use(looper);
cout << "Looper:" << looper.used << " use(s)\n"; sysop copycat;
copycat = use(looper);
cout << "Looper:" << looper.used << " use(s)\n"; cout << "use(looper):" << use(looper).used << " use(s)\n";//可以直接使用函数的返回值的结构体内的成员 return 0;
} const sysop & use(sysop & sysopref) //返回值是一个引用,可以节约赋值的时间(不用再开辟临时变量)
{
cout << sysopref.name << endl;
cout << sysopref.quote << endl;
sysopref.used++;
return sysopref;
}
一般返回值要加上const,这样子才不会修改返回值。例如下列情况。
use(looper).used=10;
不应该返回函数终止时不再存在的内存单元的引用,例如
const sysop & clone(sysop & sysopref)
{
sysop newguy;
newguy = sysopref;
return newguy;
}
即在函数内声明的引用不可以作为返回值。
三、默认参数
1、定义:
默认参数指的是当函数调用中省略了实参时自动使用的一个值。
2、设置方法:
在声明函数的时候赋值:
char *left(const char *str , int n=1);
一些规则:
(1)必须从右往左添加默认值,也就是说要为某个参数设置默认值,则,其右边的参数一定也设置了默认值、
(2)实参必须从左往右一次被赋予相应的形参,不能跳过任何的参数。
四、函数重载
1、定义:
同样的函数名称具有不同的函数功能。
2、实现方法:
对于同样名称的函数,则需要有特征量进行区分,所以特征量即为形参的个数和类型
一些规则
(1)相同的类型的引用和非引用变量是同一中特征。
(2)匹配函数时,并不区分const和非const变量。
(3)返回值类型不作为特征量
五、函数模板
1、定义:
同样的函数,只是参数的类型不同,所以制定一个函数的模板。
2、设置方法:
template <typename Any> //template可以替换为class
void Swap(Any &a, Any &b)
{
Any temp;
temp = a;
a = b;
b = temp;
}
3、重载的模板
template <class Any>
void Swap(Any &a, Any &b); template <class Any>
void Swap(Any a[],Any b[],int m);
4、显示具体化
假如定义以下的结构:
struct job
{
char name[20];
double salary;
int floor;
}
假如希望能够交换其中的salary和floor成员,而不交换两个变量的name成员。我们可以通过显示具体化来实现:
(1)相关规则
(2)一个demo
void Swap(job &,job &); template <class Any>
void Swap(Any &,Any &); template <> Swap<job> (job &,job &);//显示具体化
C++Premer Plus学习(五)——函数探幽的更多相关文章
- PostgreSQL学习手册(五) 函数和操作符
PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是Post ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- ZigBee学习五 无线温度检测
ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- JavaScript学习09 函数本质及Function对象深入探索
JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...
- TweenMax动画库学习(五)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- C++学习之函数指针
C++学习之函数指针 和数据项类似,函数也有地址,函数的地址是存储在机器语言代码的内存的开始地址.通常,这些地址对用户而言,不重要也没什么用处,但对程序而言,它却很有用. 一.函数 ...
- Javascript学习5 - 函数
原文:Javascript学习5 - 函数 在Javascript中,函数和对象是交织在一起的.有些函数的特性与对象相关联.这一点的内容在第六部分会讨论到. 这一部分主要讨论函数与其它比较熟悉的语言( ...
- SVG 学习<五> SVG动画
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- 《C++ Primer Plus》读书笔记之六—函数探幽
第八章 函数探幽 1.常规函数与内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中. 2.常规函数调用使程序跳到另外一个地址(函数地址),并在函数结束时返回,更详细的的实现过程 ...
随机推荐
- ajax 如何做到 SEO 友好
我猜你是在网络上搜索“ajax如何被搜索引擎收录”.“ajax SEO”.“ajax SEO友好”等关键词来到这里的.你可能已经很疲惫了,因为前段时间我也这样搜索,但是我发现搜索到的内容质量不高,有的 ...
- java分布式通信系统(J2EE分布式服务器架构)
一.序言 近几个月一直从事一个分布式异步通信系统,今天就整理并blog一下. 这是一个全国性的通信平台,对性能,海量数据,容错性以及扩展性有非常高的要求,所以在系统的架构上就不能简单的采用集中式.简单 ...
- asp.net记住我功能
登录页面的记住我功能 不能用session的原因:sessionID是以cookie的形式存在浏览器端的内存中 如果用户把浏览器关闭 则sessionID就消失 但是服务器端的sessi ...
- 9个 SSH常用命令选项
9个 SSH常用命令选项 SSH 是什么 SSH(全称 Secure Shell)是一种加密的网络协议.使用该协议的数据将被加密,如果在传输中间数据泄漏,也可以确保没有人能读取出有用信息.要使用 SS ...
- Telnet是什么?
Telnet协议是 用途一: 测试端口号 例子:测试本机的80端口是否打开 1.获得本机IP dos命令:ipconfig 可以看到本机的IP地址是192.168.0.102,当然这也是局域网IP,并 ...
- 理解Java中的接口
一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...
- Android四大组件之Service
Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...
- [BZOJ1998][Hnoi2010]Fsk物品调度
[BZOJ1998][Hnoi2010]Fsk物品调度 试题描述 现在找工作不容易,Lostmonkey费了好大劲才得到fsk公司基层流水线操作员的职位.流水线上有n个位置,从0到n-1依次编号,一开 ...
- 粒子滤波particle filter和目标跟踪
粒子滤波用于跟踪,参考:http://www.cnblogs.com/tornadomeet/archive/2012/03/18/2404817.html http://blog.csdn.net/ ...
- Java报错原因汇总
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序 遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的 ...