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关键字来表示这是在重载符号##
C++中重载操作符[ ]的更多相关文章
- VC6.0中重载操作符函数无法访问类的私有成员
整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...
- Python中的操作符重载
运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果. 类可以重载python的操作符 操作符重载使我们的对 ...
- C++之重载操作符
1.类中重载+操作符 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Obje ...
- C++中的操作符重载
一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...
- C++中operator关键字(重载操作符)
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...
- 《C++ Primer》之重载操作符与转换(中)
赋值操作符 类赋值操作符接受类类型形参,通常,该形参是对类类型的 const 引用,但也可以是类类型或对类类型的非 const 引用.如果没有定义这个操作符,则编译器将合成它.类赋值操作符必须是类的成 ...
- 【C++】C++中的操作符重载
C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...
- C# 中重载自增自减操作符的具体运算原理 ----从C++程序员的角度看C#自增操作符重载的实质
看了看C#的运算符重载,发现与C++打不相同.刚刚被C#的自增操作符坑了,现在来分享一下. 先定义一个类 class A { public int i; public A(int I) { i = I ...
- C++中逗号操作符重载的分析
1,关注逗号操作符重载后带来的变化: 2,逗号操作符: 1,逗号操作符(,)可以构成都好表达式:exp1, exp2, exp3, ..., expN 1,逗号表达式用于将多个表达式连接为一个表达式: ...
随机推荐
- InnoDB存储引擎文件
InnoDB存储引擎文件 MySQL数据库包括数据库本身的文件和存储引擎文件.数据库自身的文件由参数文件(my.cnf).错误日志文件.慢查询日志文件.查询日志文件.二进制日志文件.套接字文件.pid ...
- Linux系统挂载新磁盘
执行df -h 查看已挂载磁盘 未能找到挂载磁盘 1)使用fdisk -l命令查看主机上的硬盘 红圈标志为后挂载的磁盘未能挂载 2)使用mkfs.ext4命令把硬盘格式化: mkfs.ext4 /de ...
- Linux文件误删之后恢复方法
前言 今天不小心把一个文件给误删了,因为不想花半天时间重新写,就查找了一下Linux下恢复文件的方法. 因为是刚删不久,文件实际的数据应该还在 首先查看系统分区 Linux:~# df Filesys ...
- Prometheus介绍
Prometheus的主要特点 Prometheus 属于一站式监控告警平台,依赖少,功能齐全.Prometheus 支持对云的或容器的监控,其他系统主要对主机监控.Prometheus 数据查询语句 ...
- python之路——14
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1.迭代器 1.双下方法:不常直接调用,是通过其他语法触发的 2.可迭代的:可迭代协议——含有__it ...
- 4、Zookeeper简单介绍
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...
- Redis管理:安全/耗时命令日志与命令监控/数据库管理工具
1.安全管理 1)绑定指定IP Redis的安全设计是在“Redis运行在可信环境”这个前提之下的,在生产环境中建议通过应用程序连接Redis.Redis可以配置只接受来自指定IP的的请求,可通过修改 ...
- Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
VectorDrawable 矢量图 三部曲: Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图 Android 开发 VectorDrawabl ...
- Python模拟登陆TAPD
因为在wiki中未找到需要的数据,查询也很迷,打算用python登录tapd抓取所需项目下的wiki数据,方便查找. 2018-9-30 19:12:44 几步走 模拟登录tapd 抓取wiki页左侧 ...
- 实战ELK(4)Metricbeat 轻量型指标采集器
一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采 ...