美文网首页
Chapter 6 Functions

Chapter 6 Functions

作者: 再凌 | 来源:发表于2020-03-11 19:04 被阅读0次

    不定长度形参初始化

    两种方法,一种是传统的C语言风格...

    另一种则是当参数类型一致时可使用initializer_list<TYPE> name

    注意, 声明的序列都是const类型, 不可更改.

    返回初始化列表

    vector<string>  f()
    {
      return {"space", "is", "empty"}
    }
    

    注意要用大括号包起来

    返回指向数组的指针

    这个指针应当以如下方式定义:

    //类比此类变量的定义
    int a[10];
    int (*p)[10] = &a;
    
    //函数定义
    int (*function(int arg))[10];
    
    //或者利用 typedef/ using
    using myarray = int[10];
    myarray *function(int arg);
    
    //或者利用decltype(), 别忘了*
    decltype(a) (*function(int arg))
    
    //或者利用尾指针
    auto function(int arg) ->int (*) [10]
    

    const 和重载

    重载函数中对于指针, 引用的顶层const (即, 和变量最近的那个 const) 会被忽略. 底层const可以重载出不同的函数. 如果存在, 则优先调用const版本.


    对于一个写好的, 形参是const 类型的函数, 我们如果想再写一个面向非const的函数, 可以考虑使用const_cast关键字.

    新增加的函数:

    string &function(string &s)
    {
      auto &r = function( const_cast<const string&> s);
      return const_cast<string &> s;
    }
    

    显然, 在这里使用const_cast是安全的

    重载匹配

    int fun(int, int);
    int fun(double, double);
    fun(1, 1.5);
    

    当有多个函数可以匹配, 但都不是最佳匹配的时候, 编译器将检查参数是否最佳, 显然,当第一个参数是int 的时候, 和第一个函数达到了更好的匹配.
    但是检查第二个参数的时候, 和第二个函数达到了更好的匹配, 因此编译器无法选择, 会报错.

    转换方法优劣评分按照如下进行:

    1. const转换
    2. 类型提升 (char到int, short 到 int)
    3. 算数转换 (所有算数转换的权重都一样, 比如从int到float和到long)
    4. 类类转换

    指向函数的指针

    按照形参类型和返回值精准分类, 互相不可转换.

    声明: bool (*p)(string &, string &);
    赋值: p = isLarger;

    还可以使用decltype完成, 不做赘述

    还可以使用typedef完成.

    typedef bool (*f)(string &, string &)
    

    被调用的时候可以

    int something(int a, bool (*pf)(string &, string &));
    //等同于
    int something(int a,f);
    

    相关文章

      网友评论

          本文标题:Chapter 6 Functions

          本文链接:https://www.haomeiwen.com/subject/bdoqjhtx.html