zoukankan      html  css  js  c++  java
  • C++Premer Plus学习(五)——函数探幽

    一、内联函数

    1、优点:

         内联函数就是比较省资源,然后一般就是将简短,使用频率高的函数作为内联函数会比较合适。

    2、一个demo

    #include "stdafx.h"
    #include<iostream>
    
    using namespace std;
    
    inline double Square(double x) { return x*x; }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int a = 16;
        cout << Square(334);
    }

    二、引用变量(别名)

    1、创建引用变量

         C和C++使用“&”符号来表示指示变量的地址。但C++中“&”还表示声明引用

    int rat;
    int &copy = rat;
         声明引用变量的时候必须进行初始化,一定要的。

    2、将引用用作函数的形参

         直接将实参和形参进行关联起来,即类似于同一个人的不同名字。所以进行对形参的修改会导致实参一样跟着变化,因为两者本就是一体。

    3、尽可能使用const

    image

    4、将引用作用于结构

    // Exercise.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<iostream>
    
    using namespace std;
    
    struct sysop
    {
        char name[26];
        char quote[64];
        int used;
    };
    
    const sysop & use(sysop & sysopref);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        sysop looper =
        {
            "Rick "Fortran" Lopper",
            "I'm a goto kind of guy.",
            0
        };
    
        use(looper);
        cout << "Looper:" << looper.used << " use(s)
    ";
    
        sysop copycat;
        copycat = use(looper);
        cout << "Looper:" << looper.used <<  " use(s)
    ";
    
        cout << "use(looper):" << use(looper).used << " use(s)
    ";//可以直接使用函数的返回值的结构体内的成员
    
        return 0;
    }
    
    const sysop & use(sysop & sysopref)  //返回值是一个引用,可以节约赋值的时间(不用再开辟临时变量)
    {
        cout << sysopref.name << endl;
        cout << sysopref.quote << endl;
        sysopref.used++;
        return sysopref;
    }

          一般返回值要加上const,这样子才不会修改返回值。例如下列情况。

    use(looper).used=10;

          不应该返回函数终止时不再存在的内存单元的引用,例如

    const sysop & clone(sysop & sysopref)
    {
       sysop newguy;
       newguy = sysopref;
       return newguy;
    }
         即在函数内声明的引用不可以作为返回值。

    三、默认参数

    1、定义:

        默认参数指的是当函数调用中省略了实参时自动使用的一个值。

    2、设置方法:

       在声明函数的时候赋值:

    char *left(const char *str , int n=1);

    一些规则:

    (1)必须从右往左添加默认值,也就是说要为某个参数设置默认值,则,其右边的参数一定也设置了默认值、

    (2)实参必须从左往右一次被赋予相应的形参,不能跳过任何的参数。

    四、函数重载

    1、定义:

        同样的函数名称具有不同的函数功能。

     

    2、实现方法:

        对于同样名称的函数,则需要有特征量进行区分,所以特征量即为形参的个数和类型

    一些规则

    (1)相同的类型的引用和非引用变量是同一中特征。

    (2)匹配函数时,并不区分const和非const变量。

    (3)返回值类型不作为特征量

    五、函数模板

    1、定义:

         同样的函数,只是参数的类型不同,所以制定一个函数的模板。

    2、设置方法:

    template <typename Any>   //template可以替换为class
    void Swap(Any &a, Any &b)
    {
        Any temp;
        temp = a;
        a = b;
        b = temp;
    }

    3、重载的模板

    template <class Any>
    void Swap(Any &a, Any &b);
    
    template <class Any>
    void Swap(Any a[],Any b[],int m);

    4、显示具体化

         假如定义以下的结构:

    struct job
    {
       char name[20];
       double salary;
       int floor;
    }

         假如希望能够交换其中的salary和floor成员,而不交换两个变量的name成员。我们可以通过显示具体化来实现:

    (1)相关规则

    image

    (2)一个demo

    void Swap(job &,job &);
    
    template <class Any>
    void Swap(Any &,Any &);
    
    template <> Swap<job> (job &,job &);//显示具体化
  • 相关阅读:
    [opentwebst]一个简单的登陆脚本
    opentwebst一个ie自动化操作测试软件-功能强大
    给X9DRL-iF双路服务器主板刷BIOS
    在ubuntu16下面通过kvm+lvm安装ubuntu16的虚拟机
    ubuntu16安装KVM
    PowerShell全自动分配CPU
    在ubuntu16编译安装nginx-1.10.2(full)完全自带组件
    将博客搬至CSDN
    乌邦图ubuntu配置iptables的NAT上网
    LVM增大和减小ext4、xfs分区
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4674679.html
Copyright © 2011-2022 走看看