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

原创 2012年03月25日 21:02:38
不适宜复制实参的情况:
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第五版第八章学习笔记

1. 标准IO库 标准库定义了一族类型,支持对文件和控制窗口等设备的读写,还使得string对象能够像文件一样操作。采用继承来实现。 流:是以字节方式对数据从源到目标进行传递的一种描述。  输入流:...
  • sunhero2010
  • sunhero2010
  • 2015年11月12日 15:23
  • 512

c++primer plus 第八章习题答案(自己写的)

#include #include //第八章 using namespace std; void showstr(char *str, int n = 0); int main() { char ...
  • chinahnwqf
  • chinahnwqf
  • 2016年05月11日 23:25
  • 627

c++ primer plus第五版读书笔记

第一章  c++简介: 1.c语言是基于过程的,自上向下的编程语言 先分析大的解决方向,逐渐细化。 c++是面向对象的OOP,自下而上的编程语言 先设计类,然后将他们串联起来 优点是:保护数据,代码重...
  • qingzai_
  • qingzai_
  • 2016年08月03日 11:25
  • 881

C++ primer 5th 读完的一点心得体会

作为一个通信的研究生,其实我对自己所从事的方向还是有很多迷茫的。本科的时候参加过很多比赛,搞过单片机、ARM嵌入式,做过信号处理,学过matlab,学过C、C++,但是始终觉得自己浮于表面,并没有一种...
  • King_DJF
  • King_DJF
  • 2016年12月18日 10:42
  • 847

C++ Primer笔记(十七)多重继承与虚继承

多重继承是从多于一个直接基类派生类的能力。多重继承的派生类继承其所有父类的属性。 为了支持多重继承,应扩充派生列表,多个类用逗号分割。如: class panda:public bear,publ...
  • woshibendangao
  • woshibendangao
  • 2014年04月27日 11:11
  • 976

《C++ Primer》真的适合入门吗?

客气地说,《C++ Primer》不适合大学C++基础课堂教学,也不适合初学者入门。 不客气地说,恐怕你们的大学老师也搞不定《C++ Primer》,更别说拿这本书教学生了。 更不客气地说...
  • qq_23291783
  • qq_23291783
  • 2015年12月22日 16:32
  • 955

如何学习C++ primer 第五版

作者:dawnmist 链接:http://www.zhihu.com/question/32087709/answer/54936403 来源:知乎 著作权归作者所有,转载请联系作者获得授权。...
  • w3071206219
  • w3071206219
  • 2016年08月22日 22:03
  • 850

C++Primer第五版——习题答案+详解(完整版)

C++Primer第五版——习题答案详解       看的也比较快,但是有很多东西确实用不上,所以很多都没有深入的探讨,但是知识点覆盖的很全面,每一道题涉及的知识点我都写上简单的解释了。      ...
  • misayaaaaa
  • misayaaaaa
  • 2016年12月21日 16:11
  • 43429

《C++ Primer》随附代码的使用方法

(Source: C++ Primer, Fifth Edition Visual Studio 2012 Code Distribution README ) Conditional Compil...
  • guohuaien
  • guohuaien
  • 2017年02月17日 13:49
  • 545

C++primer第15章习题解答

练习15.1:什么是虚成员? 在类中被声明成virtual的成员,基类希望这种成员在派生类中重定义。除了构造函数外,任意非static成员都可以为虚成员。 练习15.2:protected访问说明...
  • sunhero2010
  • sunhero2010
  • 2016年06月06日 21:34
  • 3305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:再学C++ Primer(7)-函数
举报原因:
原因补充:

(最多只允许输入30个字)