C++ PP Chapter VIII 函数探幽

本文深入探讨了C++中的高级特性,包括内联函数、引用变量、函数返回引用的概念及应用,介绍了默认参数、函数重载、函数模板及其具体化等内容,并对C++11新增特性进行了讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  C++的内联函数
    它的存在目的就是在编译时就将函数全部复制到要使用的地方,稍微优化了时间
    而它又是按值传递,所以区别于普通的宏函数
    使用该特性必须在 内联函数声明或者函数定义前加上关键字 inline
        可以当作常规函数调用
        例如:
             inline double square (double x) { return x*x;}
    内联函数不能递归!代码过长等会被视为常规函数

2.  引用变量  (C++新增的复合类型)
    引用是已定义的变量的别名,可对该变量直接操作
    注意的是声明引用时必须将其初始化
        引用方法 例如:
                        int & rodnets = rats;

    于函数传递中使用,避免了指针出错问题
        若函数是引用的 那么声明\定义 为  stuats Function(stuats & a,...)
        而在使用的地方与按值传递无差别

    对引用加 const : const int &A = B;
    将引用用于结构体和类的传递

3.  函数返回引用:
        例如 
            结构体 StructP
            函数   StructP & FunX(StructP & target)
                   stuats FunY(StructP & target)

            返回StructP &,那么FunX返回的引用便是实际的元素,
            如果只是返回 StructP 类型,那么返回的是一个副本
            这使得 FunY(FunX(team)) 这样的函数调用出现差别:对于前者FunY可改变原数据
            //结构体可以直接赋值
            而对于 StructP & FunX(StructP & target)
            使用时可以 FunX(team) = (StructP) other 因为返回的是一个引用,可被赋值

            注! 返回的往往是作为参数传递给函数的引用(可以是隐式的),因为函数结束
            会将原本属于函数内的元素释放
            当然用 new 申请的也可作为返回对象,要注意的是使用完后需要 delete


    对于返回的引用可以使用 const 进行修饰

4.  将引用用于类对象
        与引用结构体相似 
        而形参为 string ,实参可以为 char *,因为C++内有 char *到 string 的转换功能 

5.  对象、继承和引用 (见第1317章笔记)

6.  默认参数

    默认参数指的是当函数调用中省略了实参时自动使用的一个值
    例如:
        void Cal(int n)
        如果把 n 设置为默认值 1 ,那么直接用 Cal() 就相当于 Cal(1)

    设置默认值的方法 
        在函数原型中,必须自右相左的添加默认值
            例如:
                int harpo(int n=1,int m=4,int j=5);  //valid
            使用时可以部分缺省(或全缺省) harpo(2); //valid
            但是实参必须自左向右的赋给形参,不能跳过 
                                harpo(2,,2)          //invalid
                int chico(int n=1,int m,int j=9);    //invalid


7.  函数重载(函数多态)[通过编译器的名称修饰来区分]

    使得可以使用多个重名的函数,使得他们使用不同的参数列表完成相同的工作
    函数的参数列表又称为函数特征标
    如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同

    注意不要出现 double cube(double x);
                 double cube(double &x);
            因为使用cube(n)时会出现两个都匹配的情况 
    匹配函数时,不区分是否为 const 变量

    注意:函数返回类型可以不同,但是特征标必须不同!
          函数重载中可以使用默认参数

8.  函数模板

    函数模板允许以任意类型的方式来定义函数
    必须关键字 templatetypename(可以用 class 为旧式的)
        格式例如:
            template <typename AnyType>         --> AnyType 为任意类型名
            void Swap(AnyType &a,AnyType &b)
            {
                AnyType temp;
                temp = a;
                a = b;
                b = temp;
            }

        模板本身不创建任何函数,但是它会指定编译器去定义函数


9.  重载的模板

    要求被重载的模板的函数特征标必须不同,其他的和常规函数重载类似

10. 模板的显示具体化和实例化

    具体化:
    目的是使其能够用于特定的结构或类(另一种方法是为它们重载运算符)
    当编译器找到与函数调用匹配的具体化定义时,会使用该定义而不找模板

    ISO/ANSI C++98 标准:
            a.      对于给定的函数名,可以有非模板函数、模板函数、
                显式具体化模板函数和它们的重载版本

            b.      显示具体化的原型和定义应以template<>打头,并通过
                名称来支持类型
                格式例如:
                    template <> void Swap<job>(job &,job &); 

            c.   优先级:   非模板函数 > 具体化 > 模板函数

    例如:
        void Swap(job &,job &);

        template <typename T>
        void Swap(T &,T &);

        template <> void Swap<job>(job &,job &); 
        可等价简化为 template <> void Swap(job &,job &); 

    实例化:

        隐式,就是当运行时,遇到类型时生成使用
        显式实例化,在编译时就要求编译出该类型的函数


    差别在于,具体化的函数是自己编写的,而显式实例化,给出命令让编译器实现就可以了
     格式例如:
                    template void Swap<int>(int,int);  //template 后没有 <>


11. 函数模板的发展

    a. C++11 关键字 decltype

    使用该关键字 decltype(x+y) z; 相当于声明了一个 和 x+y 类型相同的变量 z

    b. C++11 后置返回类型

        针对了模板函数的返回类型不确定情况
        结合关键字 auto 

        于是格式 :
            template <typename T1,typename T2>
            auto fun(T1 x,T2 y) -> decltype(x+y)
            {
                ...
                return x+y;
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值