第七章 函数(后续)

1.主函数的形参:int main(int argc, char *argv[]){};第二个形参argv[]是一个C风格字符串数组,第一个形参argc则用于传递该数组中字符串的个数。

2.return 语句:

  (1).返回引用时:当返回的是引用类型的时候,没有复制返回值。相反,返回的是对象本身,不是对象的副本。例如:

    const  string& manip(const string&  s1, const string&  s2 )

    {

       return s1.size()<s2.size()?s1:s2; 

     } 形参和返回类型都是指向const string 对象的引用,调用函数和返回结果时,都没有复制这些string对象。

  (2).千万不要返回局部对象的引用(和指针):当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对拒不对象的引用就会指向不确定的内存。例如:

     const string& manip(const string& s)

      {

          string ret=s;

          return ret;

        }这个函数会在运行时出错,因为它返回了局部对象的引用。

  (3).引用返回左值:返回引用的函数返回一个左值。因此,这样的函数可用于任何要求使用左值的地方:例如:

      char &get_val(string  &str ,string::size_type ix)

        {

          return str[ix];

          }

      int main()

      {

        string s("a  value");

        cout<<s<<endl;

        get_val(s,0)='A';//在这里作为左值使用

        cout<<s<<endl;

        return 0;

       }

    如果不希望引用返回值被修改,返回值应该声明为const:

      const char &get_val(...)

3.递归:int faction(int  val)

    {

      if(val>1)return faction(val-1)*val;

      return 1;

    }

4.默认实参:string screenInit(string::size_type height,string::size_type width=50);记住一点即可:默认实参是放在形参表的最后。

5.内联函数:内联函数是在返回类型前面加上关键字inline。如:inline const  string& shorterstring(const string &s1,const string &s2){}

内联函数能够在程序中每个调用电内联地展开,是为了消除函数在调用的时候的额外执行开销。内联函数一般放在头文件中。

6.类成员函数:调用成员函数是使用对象来调用。

(1)this指针:每一个成员函数都有一个额外的、隐含的形参this。在调用成员函数时,形参this初始化为调用函数的对象的地址。

(2)const成员函数的引入:跟在成员函数声明的形参表后面的const所起的作用是:const改变了隐含的this形参的类型。如:bool Sale_item::same_isbn(const Sale_item *const this ,const Sale_item &rhs) const  {} 使用这种方式的const的函数称为常量成员函数。由于this是指向const对象的指针,const成员函数不能修改调用该函数的对象。也就是说在调用的时候不能修改他们的对象的数据成员。

(3)指针this:在成员函数的调用时,指针this实际上是指向被调用函数所属对象的数据成员

7.重载函数:出现相同作用域的两个函数,如果具有相同的名字而形参表不相同,则称为重载函数。

8.指向函数的指针:函数指针是指指向函数而非指向对象的指针。像其他的指针一样,函数指针也指向某一个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。如:bool  (*pf)(const string &,const string &)这个语句将pf声明为指向函数的指针,它所指向的函数带有两个const string &类型形参和bool类型的返回值。

(1)用typedef简化函数指针的定义:函数指针类型相当的冗长。使用typedef为指针类型定义同义词。可将函数指针的使用大大简化:

  typedef  bool (*cmpFcn)(const  string &,const  string &)

该定义表示cmpFcn是一种指向函数的指针类型的名字。在要使用这种函数指针类型时,只需要直接使用cmpFcn即可,不必每次都要把整个类型声明全部写出来。

(2)在初始化函数指针时,必须返回类型和形参表的类型都完全一致。如:

typedef  bool (*cmpFcn)(const  string &,const  string &);

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

cmpFcn pf=lengthcompare;将这个函数的指针指向lengthcompare函数。

原文地址:https://www.cnblogs.com/ljy2013/p/3287959.html