zoukankan      html  css  js  c++  java
  • C++中重载操作符[ ]

    1.首先说说为什么要重载操作符[ ]
    主要是因为系统只给了整数类型(int)的重载函数,即只能在方括号中输入整数进行查找,但有时候我们可能存放数据时,下标的类型是自定义的,希望也能像数组直接通过下标访问元素的形式(形如A[i]) ,这时候就需要对下标操作符[]进行重载,使得操作得以进行

    2.重载操作符[]的作用
    一般作用是取值,引用返回值是这个值得别名,引用返回是返回原来的东西,在内存上是相同的,直接返回会创建一模一样的临时变量返回,类较大时,增加内存消耗

    3.通过operator关键字进行重载
    对操作符进行重载,需要使用operator关键字,形如: T1 T::operator[ ] (T2) 其中,T1是返回值类型,为了能对数组赋值,一般将其声明为引用形式,T是定义下标运算符的类,T2是下标类型

    4.重载操作符的原则
    不能改变操作符的原有语义和操作符个数,[]用于取元素的值,且只有一个操作数,括号内的值是针对该数组操作的,所以肯定有一个数组对象,所以也就决定了重载实现的只能是类的成员函数,因为类的成员函数具有this指针,可以指向对象本身。对象[] :对象调用[],隐含地把this指针也传进去了,查找自身数组中存放的东西

    p[i]: 其中p是一个指针,内含某个地址,取值的时候,p中的地址加上变量i的地址偏移量,返回相加后地址中所存放的值
    同理,对象[]也是如此,在对象的类中设定一个指针,假设从该指针开始的内存区域存放的是数据,在重载[]操作符中,返回值为该指针[],即对应内存,对象[]是指明使用哪个对象

    #include "stdafx.h"
    #include<iostream>
    
    using namespace std;
    typedef int Rank;
    
    template<typename T>
    class Vector
    {
    public:
    	Rank _size;
    	int _capacity;
    	T*  _elem;
    	T& operator[] (Rank r)const;
    	void copyFrom(T const*A, Rank lo, Rank hi);
    };
    
    template<typename T>
    T &  Vector<T>::operator[] (Rank r)const
    {
    	return _elem[r];
    }
    
    template<typename T>
    void Vector<T>::copyFrom(T const* A, Rank lo, Rank hi)
    {
    	_elem = new T[_capacity = 2 * (hi - lo)];
    	_size = 0;
    	while (lo < hi)
    	{
    		_elem[_size++] = A[lo++];
    	}
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//int B[5] = { 1, 2, 3, 4, 5 };
    	char B[5] = { 'a', 'b', 'c', 'd','e' };
    	//Vector<int> c;
    	Vector<char>c;
    	c.copyFrom(B, 0, 5);
    	for (int i = 0; i < 5;i++)
    	{
    		cout << B[i];
    		cout << c[i] << endl;
    	}
    
    	return 0;
    }
    

    其实,类中重载函数或者符号,实质就是调用,只不过符号是用operator关键字来表示这是在重载符号##

  • 相关阅读:
    ubuntu 完全干净的卸载docker
    thinkphp5 助手函数input的常用方法
    thinkphp6
    docker编排
    Linux下的tar压缩解压缩命令详解
    scp拷贝命令
    一行命令搞定node.js 版本升级
    git 设置文件大小写敏感
    ubuntu1804php安装
    关于权限表的基本设计
  • 原文地址:https://www.cnblogs.com/ymd12103410/p/9956463.html
Copyright © 2011-2022 走看看