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

编译器默认的函数:

  

原文地址:https://www.cnblogs.com/hjxzjp/p/11729748.html

时间: 2024-08-29 21:24:27

C++ 数组操作符重载、函数对象分析、赋值操作符的相关文章

C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象

重载操作符与转换 --调用操作符和函数对象 引言: 能够为类类型的对象重载函数调用操作符:一般为表示操作的类重载调用操作符! struct absInt { int operator() (int val) { return val > 0 ? val : -val; } }; 通过为类类型的对象提供一个实參表而使用调用操作符,所用的方式看起来系那个一个函数调用: absInt absObj; int i = -1; cout << absObj(i) << endl; 虽然

函数对象分析

首先我们看我们接到的一个用户需求: 编写一个函数: -函数可以获得斐波那契数列每项的值 -没调用一次返回一个值. -函数可以重复使用根据需要. 1 for(int i = 0; i<10; i++) 2 { 3 cout <<fib() << endl; 4 } 比如斐波那契函数,第一二次调用返回1 三次调用返回2,四次返回3.. 1 #include <iostream> 2 #include <string> 3 4 using namespace

在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数

看视频教程说不能在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数 我试了试,可以,放出测试代码: #include <iostream> using namespace std; template<typename T> class A { public: A(T a) { this->a = a; } template<typename T> //加上这句就可以了 friend A<T> operator+(A<T> &

C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过:构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数.构造函数的工作就是保证每个对象的数据成员具有合适的初始值. 构造函数与其他函数不同:构造函数和类同名,没有返回类型. 构造函数与其他函数相同:构造函数也有形参表(可为void)和函数体.  (参数表为void的构造函数为默认构造函数

函数对象分析(二十九)

通过前面对 C++ 的学习,客户又有一个新的需求摆在我们的面前了.编写一个函数:函数可以获得斐波拉契数列每项的值:没调用一次便返回一个值:函数可根据需要重复使用. 我们之前在 C 语言中也讲过斐波拉契数列,相信这个很好实现了.那么我们就编写的程序如下 #include <iostream> using namespace std; int fib() {     static int a0 = 0;     static int a1 = 1;          int ret = a1;  

C++ 流操作符重载函数

1. 问题 在C++中,在进行输入输出操作时,我们首先会想到用cout, cin这两个库操作语句来实现,比如 cout << 8 << "hello world!" << endl; cin >> s; cout,cin分别是库ostream, istream里的类对象 如果想要cout,cin来输出或输入一个类对象,这样的需求它能满足吗?很显然,原来的cout不太可能满足直接输入输出一个我们自定义的类对象, 但是只要我们对<<

C++--操作符重载 复数类

一.操作符重载 Q:下面的复数解决方案是否可行? class Complex { public: int a; int b; }; int main() { Complex c1={1,2}; Complex c2={3,4}; Complex c3=c1+c2; return 0; } 该段代码想要实现的是将两个复数类进行相加得出第三个类代码实现的运行结果由上面的结果图可以得知,出现的错误是无法匹配+号操作符的操作,同时出现 的潜在问题是a与b是public成员,在实际的操作中应将a与b设置为

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

C++复制控制:赋值操作符和析构函数

一.赋值操作符 类定义了该类型对象赋值时会发生什么.与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个. 1.重载操作符的简单介绍 重载操作符是一些函数,其名字为operator后跟着所定义的操作符的符号,通过定义名为operator=的函数,我们可以对赋值进行定义.操作符函数的形参表必须具有与该操作数数目相同的形参(如果操作符是一个成员,则包括隐式this形参).赋值是二元操作符,对应的两个形参,第一个形参为左操作数,第二个形参为右操作数. 注意: (1)当操作符为成员函数时