`
mmdev
  • 浏览: 12927828 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

再学C++ Primer(7)-函数

 
阅读更多
不适宜复制实参的情况:
1)当需要在函数中修改实参的值时;
2)当需要以大型的对象作为实参时;
3)当没有办法实现对象复制时;


使用引用形参返回额外的信息
#include <iostream>
#include <vector>
using namespace std;
//函数说明:找出范围内特定的值出现的次数,并返回第一次出现的迭代器
vector<int>::const_iterator findVal(vector<int>::const_iterator begin,vector<int>::const_iterator end,int value,vector<int>::size_type &occurs)
{
vector<int>::const_iterator p=end;
occurs=0;
for(;begin!=end;++begin)
if(*begin==value)
{
if(p==end) p=begin;
++occurs;
}
return p;
}
int main()
{
vector<int> iVector;
vector<int>::size_type a;
iVector.push_back(1);
iVector.push_back(2);
iVector.push_back(3);
iVector.push_back(2);
vector<int>::const_iterator iter=findVal(iVector.begin(),iVector.end(),2,a);
cout << a<<*iter<<"Hello world!" << endl;
return 0;
}

如果使用引用形参的唯一目的是避免复制实参,则应该将形参定义为const引用。


应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参初始化。


通常函数应该有vector或其他标准库容器类型的形参。调用含有普通的非引用vector形参的函数将会复制vector的每一个元素。


将数组形参直接定义为指针要比使用数组语法定义要好,若设成数组形参,容易引起误解,造成越界错误。


不需要修改数组形参的元素师,函数应该将形参定义为指向const对象的指针。如:void f(const int *).


千万不要返回一个局部对象的引用。


求公约数(惠普实习生面试题):
#include <iostream>
#include <math.h>
using namespace std;
int rgcd1(int a,int b);//递归求解
int rgcd2(int a,int b);//迭代求解
int main()
{
cout<<rgcd1(9,6)<<endl;
cout<<rgcd2(16,12)<<endl;
cout << "Hello world!" << endl;
return 0;


}
int rgcd1(int a,int b)
{
if(b!=0) return rgcd1(b,a%b);
else return a;
}
int rgcd2(int a,int b)
{
int t;
if(b==0||a==0) return (abs(a-b));
t=a%b;
while(t)
{
a=b;b=t;t=a%b;
}
return b;


}


函数定义时,如果有一个形参具有默认实参,那么它后面所有的形参都必须有默认实参。
在设计带有默认实参函数的的时候,要注意排列形参,使最少使用默认实参的形参排列
在最前,最肯能使用默认实参的形参排在最后。


静态局部对象一旦被创建,在主程序结束前都不会撤销。可用作计数器。生命周期为整个源程序,但作用域与自动变量相同。
遵守一般的访问规则。


关于静态数据成员:对于所有的对象共有一个成员变量的就用static ,提供一个所有对象共有的一个成员变量比“每一个类对象维护一个成员变量” 要更有效。
每个类对象都有自己的拷贝而静态数据成员对每个类类型只有一个拷贝静态数据成员,只有一份由该类类型的所有对象共享访问。同全局对象相比使用静态数据成员有两个优势
1 静态数据成员没有进入程序的全局名字空间因此不存在与程序中其他全局名字冲突的可能性
2 可以实现信息隐藏静态成员可以是private 成员而全局对象不能

关于静态函数成员:
静态成员函数:使用static关键字声明的函数成员使静态的,静态成员函数同样也属于整个类,由同一个类的所有对象共同维护,为这些对象所共享.

静态成员函数一般只能访问静态成员变量,如果要访问非静态成员变量的话,只能访问某一个对象的非静态成员变量和静态成员函数。可以传一个对象的指针,引用等参数给这个静态成员函数。


在类的定义体外部引用类的static成员时,必须指定成员时哪个类中定义的。static关键字只能用于类定义体内部的声明中,定义不能标示为static。


内联函数(inline)
将小操作定义为函数的好处:
1)可读性好2)可维护性高3)可重用
定义为内联函数可以避免函数调用的开销
内联函数应当在头文件中定义。


类的成员函数既可以在类的定义内也可以在类的定义外,
编译器会隐式地将在类内定义的成员函数当作内联函数。


const成员函数在函数原型署名和函数定义中都要增加const限定,指明其为不改变对象的成员函数。


const对象,指针或引用只能用于调用其const成员函数,非const成员函数可能企图修改常量的数据成员。


重载函数:出现在相同作用域中的两个函数,具有相同的名字而形参不同,不能仅仅基于不同的返回类型而实现。
仅当形参是引用或指针时,形参是否为const才能影响。


指向函数的指针即函数的入口;例子如下:
#include <iostream>


using namespace std;
int max(int a,int b);


int main()
{
int c;
int (*p)(int,int);
p=max;
c=(*p)(9,6);
cout << c<<"Hello world!" << endl;
return 0;


}
int max(int a,int b)
{
return a>=b?a:b;
}


使用typedef能更直观地定义,
如typedef char (*PTRFUN)(int);
PTRRFUN pFun;
typedef的功能时定义新的类型,第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数,并返回char型,第二行使用此新类型定义了指针函数。
( 关于typedef的用法,详细请看这篇文章:http://www.cnblogs.com/charley_yang/archive/2010/12/15/1907384.html)

分享到:
评论

相关推荐

    C++Primer视频(初级)下载地址

    第7章重载函数函数匹配 72.第7章重载函数实参转换 73.第7章指向函数的指针 74.第8章面向对象的标准IO库 75.第8章条件状态 76.第8章文件流对象的使用 77.第8章重点习题解答 78.第8章文件模式 79.第8...

    C++ primer之泛型函数

    C++ primer之泛型函数

    非常经典的c++ primer视频教程6-10

    本课程是C++ Primer初级教程,课程内容是学习C++语言基础知识,对应着教材的第1章到第8章。 第1章 快速入门 1.1 编写简单的C++程序 1.2 初窥输入/输出 1.2.1 标准输入与输出对象 1.2.2 一个使用IO库的程序 ...

    C++ Primer习题集(第五版)

    C++ Primer习题集(第五版) , 带目录完整版。 --------------------------------------------------------------------------- 目录 第1章............................................................ 1 练习1.1 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 ...

    C++ Primer Plus学习(七)

    C++ Primer Plus学习(七),分为下面几个部分: 操作符重载 友元函数 类的继承 访问控制protected

    C++Primer视频(高级)下载地址

    28.15章 派生类的构造函数和析构函数 29.15章 转换与继承 30.15章 友元与继承 31.15章 静态成员与继承 32.15章 纯虚函数与抽象类 33.16章 模板与泛型编程 34.16章 类模板 - 顺序队列 35.16章 类模板 ...

    C++primer 课后题答案

    C++primer 课后题答案 目录 第一章 快速入门 2 第二章 变量和基本类型 7 第三章 标准库类型 13 第四章 数组和指针 21 第五章 表达式 31 第六章 语句 37 第七章 函数 37 第八章 标准IO库 37 第九章 顺序容器 43 第十...

    C++Primer中文版_第4版__函数_习题解答_文字分享.pdf

    C++Primer中文版_第4版__函数_习题解答_文字分享.pdf

    C++Primer Plus学习笔记(四)

    第八章函数探幽 内联函数 默认参数 函数重载 函数模板

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    《C++ Primer中文版(第3版)》(Stanley B. Lippman[美]、Josee Lajoie[美] 著,潘爱民、张丽 译)

    C++ Primer结合了Stanley Lippman的实践经验和Josée Lajoie对于ANSI/ISO标准C++的深入理解,此第三版被重新改写,以便更加精确地讲述标准C++的特性和用法。对于C++初学者特别有价值的是一些来自真实世界中的程序...

    C++Primer Plus学习笔记(三)

    C++ primer plus学习笔记之三,分为一下几个部分: 函数参数:介绍了函数的生命规则以及定义 数组函数:数组作为变量时的使用方法 指针和const:灵活运用指针和const 函数和二维数组:二维数组作为变量时声明以及定义...

    C++ Primer 3rd Edition 中文完美版

    虽然本书书名C++ Primer 的中文含义是C++初级读本但是它绝对不是一本很轻 松的入门教材特别是关于名字空间函数重载解析过程模板机制和泛型算法generic algorithms 等内容并不是一个C++初学者能够很快掌握的如果你...

    C++ primer 第十六章 模板句柄 C++11,使用委派构造函数,

    C++11,使用委派构造函数,并且快速初始化变量,default关键字重声明默认构造函数,回复pod状态。分析与推荐用法。

    C++Primer第五版 第6章 函数(练习解答)

    C++Primer第五版 第6章 函数(练习解答) 个人总结的文档+源码,供学习参考之用,有遗漏之处,请参考我的博客

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    C++primer part2

    ~\n-----------------------\n 作为Windows开发人员的必备参考,《Windows核心编程》是为打算理解Windows的C和C++程序员精心设计的。第5版全面覆盖 Windows XP,WindowsVista和WindowsServer2008中的170个新增函数和...

    C语言中文帮助文档(内涵C++ primer)

    内含:C++Primer4E、 C函数(index)、C函数速查、C语言编程宝典、C语言资料大全1.0、Tc图形函数详解

Global site tag (gtag.js) - Google Analytics