C++,关于operator的详细总解,(原理和用法)
尤其是关于字符数组下标的那个operator的用法,本人没有C++书本,只是靠网上教学视频来学习的,这个问题让我很困惑,希望大家来帮忙啊...
尤其是关于字符数组下标的那个operator的用法,本人没有C++书本,只是靠网上教学视频来学习的,这个问题让我很困惑,希望大家来帮忙啊
展开
2个回答
展开全部
举个例子:Class A
{……;
private:
vector<int> vec;
}
假设有对象a,一般我们想用a.vec[index]来调用数据,但vec是私有啊。
所以你想a[index]来调用vec中的数据。
那么 A &A::operator[](int index)
{ return vec[index];
}
这样就行了。
要把重载理解成函数,operator[]就是一个函数名,参数就是index
相当于a.operator[](index);
希望能帮助你理解!
{……;
private:
vector<int> vec;
}
假设有对象a,一般我们想用a.vec[index]来调用数据,但vec是私有啊。
所以你想a[index]来调用vec中的数据。
那么 A &A::operator[](int index)
{ return vec[index];
}
这样就行了。
要把重载理解成函数,operator[]就是一个函数名,参数就是index
相当于a.operator[](index);
希望能帮助你理解!
展开全部
一、重载例子:
class COperator
{
public:
int a;
int b;
public:
COperator (void);
COperator (COperator &op);
~COperator (void);
//操作符重载
COperator operator +(COperator &op);
friend COperator operator - (COperator &op1,COperator &op2);
COperator &operator ++ (int);
COperator operator ++();
};
#include ".\opartor.h"
#include <iostream>
using namespace std;
COperator::COperator(void)
{
}
COperator::~COperator(void)
{
}
COperator::COperator(COperator &op)
{
this->a = op.a;
this->b = op.b;
cout << "COPY构造被调用"<<endl;
}
COperator COperator::operator +(COperator &op)
{
COperator temp;
temp.a = this->a + op.a;
temp.b = this->b + op.b;
cout << "重载加法被调用"<<endl;
return temp;
}
COperator operator -( COperator &op1,COperator &op2)
{
COperator temp;
temp.a = op1.a - op2.b;
temp.b = op1.b - op2.b;
cout << "友元重载减法被调用" <<endl;
return temp;
}
COperator COperator::operator ++()
{
COperator temp(*this);
(this->a)++;
(this->b)++;
cout << "右增量被调用" <<endl;
return temp;
}
COperator &COperator::operator ++(int)
{
cout << "左增量被调用" <<endl;
(this->a)++;
(this->b) ++;
return *this;
}
上述是一个重载的例子。应该说这几种重载包含了重载的各种类型。下述章节中会分类介绍。
三、可以重载的运算符
C++规定了五个不能重载的运算符“.、::、.*、.->*、?”其它运算符都是可以重载的。
下列运算符不允许重载:
.,.,::,?:
四、运算符重载格式
返回类型 operator 运算符号(参数说明)
例如上例中对加法的重载: COperator operator +(COperator &op);
C++中规定,运算符中参数说明是内部类型时,不能重载。运算符重载过程中不会改变改运算符的运算优先级。
五、运算符重载的参数
运算符重载的参数,往往是初学者难以掌握的。其实很简单:参加运算的所有变量都是运算符的参数。比如说加法重载过程中,有两个参与的变量:加数和被加数。那我们就我对它进行重载的过程中需要两个参数。
需要指出的增量运算符有两种形式,前增量(运算符在变量前面)和后增量。前增量我们可以把他看做只有一个参数,而后增量我们可以看为a++0。事实上他是两个参数。只是在运算过程中,第二个参数我们不用而已。
运算符的重载有两个方式,一种是做为成员函数,另一种是做为友无函数。前种C++默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。比如对加法的重载:
成员方式为:COperator operator +(COperator &op);在调用的过程中我们可以理解为result = operator+(op)
友元方式为:friend COperator operator - (COperator &op1,COperator &op2);在调用的过程中我们可以理解为result = operator-(op1,op2);
注:上面的理解方式可以看出,除了在调用形式上不同,重载的运算符和普通的函数是等效的。
六、返回值
C++中没有对重载函数的返回值做太多的限制。为了使调用都能够理解你所重载的函数,不会产生二义性。一般来讲重载运算符的返回值会是该类的对象或是该类对象的引用。
在C++中所有函数(包括重载的运算符)在返回的过程中会构建一个返回类型的临时对象。当函数执行完之后,这个对象会消失。应该说它是C++中生命周期最短的变量。值得指出的是,系统构建这个临时对象的过程中会调用COPY构造函数。关于这一点笔都会在另一个话题中说明。
重载返回值是返回引用还是返回一个对象是由我们需要决定的。为了不让调用者曲解,如果在运算过程中改变了参与运算的变量的值往往我们返回引用,如果不改变的话我们返回对象。例如:在加法重载中,两个参与运算的变量都没有改变,所以我们就要返回一个新的对象,而不是两个对象中的一个。(不要返回一个局部引用,会出错的)。而在前增量运算的过程中,返回的是我们改变后的对象,这样直接返回引用就可以的。
重载运算符坚持4个“不能改变”。
不能改变运算符操作数的个数;
不能改变运算符原有的优先级;
不能改变运算符原有的结合性;
不能改变运算符原有的语法结构。
·····下标运算符重载
由于C语言的数组中并没有保存其大小,因此,不能对数组元素进行存取范围的检查,
无法保证给数组动态赋值不会越界。利用C++的类可以定义一种更安全、功能强的数组类型
。为此,为该类定义重载运算符。
下面先看看一个例子:
#include <iostream.h>
class CharArray
~CharArray
int GetLength
char & operator ;
private:
int Length;
charBuff;
};
char & CharArray::operator
}
void main
该数组类的优点如下:
其大小不心是一个常量。
运行时动态指定大小可以不用运算符new和delete。
当使用该类数组作函数参数时,不心分别传递数组变量本身及其大小,因为该对
象中已经保存大小。
在重载下标运算符函数时应该注意:
该函数只能带一个参数,不可带多个参数。
不得重载为友元函数,必须是非static类的成员函数。
假如定义了一个类A,A有一个私有成员是一个整型数组int member[size]。,有一个对象obj,需要访问数组中的某个成员,则需要obj.member[3]=5。重载以后则可以obj[3]。这里obj[3]看似一个数组,其实不是,在这里是一个对象。通过下标操作符[3]访问对象obj的第4个元素。
const版本声明:
const int& operator[](int index) const //表示成员函数只能访问数据成员,不能修改数据成员;给const的对象使用;
{return rep[index];}
非const版本声明:
int& operator[](int index) //可以修改数据成员;给非const的对象使用。
{return rep[index];}
在程序中对下标进行重载的时候一般要同时使用以上两个版本的重载方法。只有非const版本无法赋值,只有const版本无法修改,两者缺一不可。
下标符号(单目运算符)的重载必须是类的成员函数。
class COperator
{
public:
int a;
int b;
public:
COperator (void);
COperator (COperator &op);
~COperator (void);
//操作符重载
COperator operator +(COperator &op);
friend COperator operator - (COperator &op1,COperator &op2);
COperator &operator ++ (int);
COperator operator ++();
};
#include ".\opartor.h"
#include <iostream>
using namespace std;
COperator::COperator(void)
{
}
COperator::~COperator(void)
{
}
COperator::COperator(COperator &op)
{
this->a = op.a;
this->b = op.b;
cout << "COPY构造被调用"<<endl;
}
COperator COperator::operator +(COperator &op)
{
COperator temp;
temp.a = this->a + op.a;
temp.b = this->b + op.b;
cout << "重载加法被调用"<<endl;
return temp;
}
COperator operator -( COperator &op1,COperator &op2)
{
COperator temp;
temp.a = op1.a - op2.b;
temp.b = op1.b - op2.b;
cout << "友元重载减法被调用" <<endl;
return temp;
}
COperator COperator::operator ++()
{
COperator temp(*this);
(this->a)++;
(this->b)++;
cout << "右增量被调用" <<endl;
return temp;
}
COperator &COperator::operator ++(int)
{
cout << "左增量被调用" <<endl;
(this->a)++;
(this->b) ++;
return *this;
}
上述是一个重载的例子。应该说这几种重载包含了重载的各种类型。下述章节中会分类介绍。
三、可以重载的运算符
C++规定了五个不能重载的运算符“.、::、.*、.->*、?”其它运算符都是可以重载的。
下列运算符不允许重载:
.,.,::,?:
四、运算符重载格式
返回类型 operator 运算符号(参数说明)
例如上例中对加法的重载: COperator operator +(COperator &op);
C++中规定,运算符中参数说明是内部类型时,不能重载。运算符重载过程中不会改变改运算符的运算优先级。
五、运算符重载的参数
运算符重载的参数,往往是初学者难以掌握的。其实很简单:参加运算的所有变量都是运算符的参数。比如说加法重载过程中,有两个参与的变量:加数和被加数。那我们就我对它进行重载的过程中需要两个参数。
需要指出的增量运算符有两种形式,前增量(运算符在变量前面)和后增量。前增量我们可以把他看做只有一个参数,而后增量我们可以看为a++0。事实上他是两个参数。只是在运算过程中,第二个参数我们不用而已。
运算符的重载有两个方式,一种是做为成员函数,另一种是做为友无函数。前种C++默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。比如对加法的重载:
成员方式为:COperator operator +(COperator &op);在调用的过程中我们可以理解为result = operator+(op)
友元方式为:friend COperator operator - (COperator &op1,COperator &op2);在调用的过程中我们可以理解为result = operator-(op1,op2);
注:上面的理解方式可以看出,除了在调用形式上不同,重载的运算符和普通的函数是等效的。
六、返回值
C++中没有对重载函数的返回值做太多的限制。为了使调用都能够理解你所重载的函数,不会产生二义性。一般来讲重载运算符的返回值会是该类的对象或是该类对象的引用。
在C++中所有函数(包括重载的运算符)在返回的过程中会构建一个返回类型的临时对象。当函数执行完之后,这个对象会消失。应该说它是C++中生命周期最短的变量。值得指出的是,系统构建这个临时对象的过程中会调用COPY构造函数。关于这一点笔都会在另一个话题中说明。
重载返回值是返回引用还是返回一个对象是由我们需要决定的。为了不让调用者曲解,如果在运算过程中改变了参与运算的变量的值往往我们返回引用,如果不改变的话我们返回对象。例如:在加法重载中,两个参与运算的变量都没有改变,所以我们就要返回一个新的对象,而不是两个对象中的一个。(不要返回一个局部引用,会出错的)。而在前增量运算的过程中,返回的是我们改变后的对象,这样直接返回引用就可以的。
重载运算符坚持4个“不能改变”。
不能改变运算符操作数的个数;
不能改变运算符原有的优先级;
不能改变运算符原有的结合性;
不能改变运算符原有的语法结构。
·····下标运算符重载
由于C语言的数组中并没有保存其大小,因此,不能对数组元素进行存取范围的检查,
无法保证给数组动态赋值不会越界。利用C++的类可以定义一种更安全、功能强的数组类型
。为此,为该类定义重载运算符。
下面先看看一个例子:
#include <iostream.h>
class CharArray
~CharArray
int GetLength
char & operator ;
private:
int Length;
charBuff;
};
char & CharArray::operator
}
void main
该数组类的优点如下:
其大小不心是一个常量。
运行时动态指定大小可以不用运算符new和delete。
当使用该类数组作函数参数时,不心分别传递数组变量本身及其大小,因为该对
象中已经保存大小。
在重载下标运算符函数时应该注意:
该函数只能带一个参数,不可带多个参数。
不得重载为友元函数,必须是非static类的成员函数。
假如定义了一个类A,A有一个私有成员是一个整型数组int member[size]。,有一个对象obj,需要访问数组中的某个成员,则需要obj.member[3]=5。重载以后则可以obj[3]。这里obj[3]看似一个数组,其实不是,在这里是一个对象。通过下标操作符[3]访问对象obj的第4个元素。
const版本声明:
const int& operator[](int index) const //表示成员函数只能访问数据成员,不能修改数据成员;给const的对象使用;
{return rep[index];}
非const版本声明:
int& operator[](int index) //可以修改数据成员;给非const的对象使用。
{return rep[index];}
在程序中对下标进行重载的时候一般要同时使用以上两个版本的重载方法。只有非const版本无法赋值,只有const版本无法修改,两者缺一不可。
下标符号(单目运算符)的重载必须是类的成员函数。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询