zoukankan      html  css  js  c++  java
  • c++ primer学习笔记(5)函数(1)

    一.基础

    1.无参函数

    #include <iostream>
    #include <string>
    
    //无参数,无返回值
    void SayHello()
    {
        std::cout << "Hello" << std::endl;
    }
    //效果相同
    void SayHello2(void)
    {
        std::cout << "Hello" << std::endl;
    }
    

    2.有参函数

    //有参数,无返回值
    void Subtract(int a,int b)
    {
        std::cout << "result:";
        std::cout << a-b << std::endl;
    }
    

    3.有返回值

    //有返回值
    int Max(int a,int b)
    {
        if(a>b)
            return a;
        return b;
    }
    

    测试代码

    SayHello();
    Subtract(10,5);
    std::cout << "Max result:";
    std::cout << Max(11,22)<< std::endl;
    

    image

    二.传参

    1.非引用形参(值类型复制)

    //无效
    void Zero1(int p)
    {
        p=0;
    }
    

    2.指针形参

    //更改有效
    void Zero2(int *p)
    {
        *p=0;
    }
    

    注意:两者都是需要复制

    Test

        int i = 42;
        int *p = &i;
        std::cout << "i: " << i << '\n';   // prints i: 42
        Zero1(i);
        std::cout << "i: " << i << '\n';   // prints i: 42
        Zero2(p);
        std::cout << "after i: " << i << '\n';   // prints i: 0
    

    image

    3.const形参(参数不可更改)

    //编译通过
    int Fix(int a)
    {
        if(a>10)
          a=10;
        return a;
    }
    
    int ReadFix(const int a)
    {
        //错误,无法编译
        if(a>10)
          a=10;
        return a;
    }
    

    4.引用形参(引用是别名)

    经典的swap方法

    //无效
    void swap1(int v1, int v2)
    {
        int tmp = v2;
        v2 = v1;    
        v1 = tmp;
    }    
    
    //有效
    void swap2(int &v1, int &v2)
    {
        int tmp = v2;
        v2 = v1;
        v1 = tmp;
    }
    

    Test1

    int i = 10;
    int j = 20;
    cout << "Before swap():\ti: "
         << i << "\tj: " << j << endl;
    swap1(i, j);
    cout << "After swap():\ti: "
         << i << "\tj: " << j << endl;
    

    image

    Test2换做swap2的结果

    image

    5.const引用

    bool isShorter(const string &s1, const string &s2)
    {
        return s1.size() < s2.size();
    }
    

    不对引用进行修改和复制

    6.更灵活的const引用

     int incr(int &val)
    {
        return ++val;
    }
    
    int main()
    {
             short v1 = 0;
             const int v2 = 42;
             int v3 = incr(v1);   // error: v1 is not an int
             v3 = incr(v2);       // error: v2 is const
             v3 = incr(0);        // error: literals are not lvalues
             v3 = incr(v1 + v2);  // error: addition doesn't yield an lvalue
             int v4 = incr(v3);   // ok: v3 is a non const object type int
             return 0;
    }
    

    非const引用形参只能与完全同类型的非const对象关联,要求非常严格.

  • 相关阅读:
    转载:C#制作PDF
    搜索研究
    HDU 4029 Distinct Submatrix [后缀数组]
    HDU 4336 Card Collector [状态压缩概率DP]
    ZOJ 3329 One Person Game [数学期望]
    POJ 2096 Collecting Bugs[数学期望]
    HDU 4338 Simple Path [双联通分量+RMQ(LCA)]
    POJ 1222 EXTENDED LIGHTS OUT [高斯消元]
    HDU 2258 Continuous Same Game (1)[模拟]
    HDU 4339 Query [树状数组]
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1964120.html
Copyright © 2011-2022 走看看