• C++ 数组操作符重载、函数对象分析、赋值操作符


    string类型访问单个字符  

    #include <iostream>
    #include <string>
    #include <sstream>
    
    
    
    using namespace std;
    
    //访问 string单个字符
    
    int main()
    {
        
    
        string s = "1a2b3a4c";
        int n = 0;
        for(int i=0 ; i< s.length() ; i++)
            {
    
                if(isdigit(s[i]))//isdigit 判断字符是否0-9的阿拉伯数字 为真返回flase  否则返回true
                                //这里 使用s[i]  直接访问数组s中的字符
                    n++;//执行结果 n = 4            
            }
        cout << n <<endl;
        
        return 0;
    }

      数组范文符是 C/C++内置的操作符。  实质是 数组访问 与 指针运算 。

      a[n] <==> *(a+n)<==>*(n+a)<==>n[a]

    实验代码:  

    #include <iostream>
    #include <string>
    #include <sstream>
    
    
    
    using namespace std;
    
    //测试a[n] <==> *(a+n)<==>*(n+a)<==>n[a]
    
    int main()
    {
        
        int s[5]  ={1,2,3,4,5};
        for(int i=0 ; i< 5; i++)
            cout << s[i] <<" ";//使用s[i]  访问数组S 输出结果12345
        cout << endl;
    
        for(int i=0 ; i< 5; i++)
            cout << *(s+i) <<" ";//使用*(s+i)  访问数组S 输出结果12345
        cout << endl;    
    
        for(int i=0 ; i< 5; i++)
            cout << *(i+s) <<" ";//使用*(i+s)  访问数组S 输出结果12345
        cout << endl;    
        
        for(int i=0 ; i< 5; i++)
            cout << i[s] <<" ";//使用 i[s]   访问数组S 输出结果12345
        cout << endl;    
        return 0;
    }

    数组访问操作符([])

      只能通过类的函数进行重载。

      重载函数只能使用一个参数。

      可以定义多个不同的重载函数。  

    #include <iostream>
    #include <string>
    #include <sstream>
    
    
    
    using namespace std;
    
    //测试 数组访问操作符([])
    /*    []操作符重载规则
        只能通过类的函数进行重载。
    
      重载函数只能使用一个参数。
    
      可以定义多个不同的重载函数。
    */
    
    
    class Test
    {
        int a[5];
        public:
            int& operator[](int i)            
                {
                    return a[i];
                }
            Test()
                {
                    for(int i = 0;i<5 ;i++)
                        a[i] = i;
                }
            int length()
                {
                    return 5;
                }
    };
    int main()
    {
        
        Test t;
        for(int i = 0 ; i< t.length();i++)
            cout << t[i]<<" ";//将调用到      int& operator[](int i)这个函数t是Test创建的对象。使用对象加([])的方式访问Test数组中的私有数组
            cout <<endl;
        return 0;
    }

    既然上面可以在类中重载([]数组操作符) 那么同理,也应该可以重载 () 这个符号。

      1、只能通过类的成员函数重载

      2、可以定义多个不同参数的重载。

      3、函数对象在工程中取代指针函数。

    实验:实现获取 斐波那契数列 每项值

      

    #include <iostream>
    #include <string>
    #include <sstream>
    
    
    
    using namespace std;
    
    //实现()实现获取 斐波那契数列 每项值
    /*    
        斐波那契数列
        a0 = 0
        a1 = 1
    */
    
    
    class Fid
    {
        int a0;
        int a1;
        public:
            Fid()//构造函数  初始化 a0 a1
                {
                    a0 = 0;
                    a1 = 1;
                }
            Fid(int n)
                {            
                    a0 = 0;
                    a1 = 1;
                    for(int i = 2; i<= n; i++)
                    {
                     int t = a1;
                     a1 = a1+a0;
                     a0 = t;
                    }
                }
            int operator() ()//重载()操作符
                {
                    int ret =a1;
                    a1 = a1+a0;
                    a0 = ret;
                     return ret;
                }
            
    };
    int main()
    {
        
        Fid fid;
        for(int i = 0;i< 10;i++)
            cout <<fid() <<endl;
        cout <<endl;
    
        Fid fid1(5);
        for(int i = 0;i< 5;i++)
            cout <<fid1() <<endl;
        return 0;
    }

    运行结果:

    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    
    5
    8
    13
    21
    34

      关于赋值操作符:重载赋值操作符,必然需要实现深拷贝。

      1、编译器默认了赋值操作符

      2、默认赋值操作符为浅拷贝

      3、需要使用到深拷贝的时候需要重载赋值操作符。

      4、赋值操作符与拷贝构造函数有相同的存在意义

    编译器默认的函数:

      

  • 相关阅读:
    HDU 1828 Picture (线段树:扫描线周长)
    [USACO18OPEN] Multiplayer Moo (并查集+维护并查集技巧)
    NOIP2016 天天爱跑步 (树上差分+dfs)
    NOIP2013 华容道 (棋盘建图+spfa最短路)
    NOIP2015 运输计划 (树上差分+二分答案)
    NOIP2018 前流水账
    luogu P2331 [SCOI2005]最大子矩阵
    luogu P2627 修剪草坪
    CF101D Castle
    luogu P2473 [SCOI2008]奖励关
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/11729748.html
Copyright © 2020-2023  润新知