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、赋值操作符与拷贝构造函数有相同的存在意义

编译器默认的函数:

  

 

posted @ 2019-10-23 23:14  Dipsyhu  阅读(600)  评论(0编辑  收藏  举报