c++学习之操作符重载
2013-08-04 16:54
281 查看
终于看到操作符重载了,这个单词在我的大脑里存在了10年,但是我一直没搞明白是个什么意思,java里面根本没有操作符重载一说,大学的时候也没好好学,今天就好好研究研究。
操作符重载,和函数重载是一个道理,就是说一个操作符可以根据需要,我们自己定义它的算法。在c++语言支持的范围里面,操作符都仅支持基本类型的计算。如果要让操作符支持我们自己定义的类运算,就需要使用操作符重载了。
来看看吧,我们上一节的例子中,定义了Rectangle类,里面有两个变量。如果要定义两个Rectangle类的加法,肿么办?先看看操作符重载的基本定义方法吧。
type operator sign (parameters);
type:就是返回的类型。计算了右值,就需要有个左值来实现赋值计算呀。
operator :表示的是操作符的意思,定义的时候,用这个表示我们要进行操作符重载啦。
sign:表示要重载的操作符。比如+,-,*,/等。
parameters:表示参与操作的另外一方。
上面这个解释我尽量用了比较简单的说明,但是如果没有例子,还是很抽象,我这里就写一个Rectangle相加的例子吧。看代码,将上个例子的Rectangle的类定义改为如下的:
class Rectangle
{
private:
int x;
int y;
public:
Rectangle(int,int);
~Rectangle();
int area();
Rectangle operator + (Rectangle);
int getX(){return x;}
int getY(){return y;}
void setX(int a){x = a;}
void setY(int b){y = b;}
};
其中Rectangle operator +(Rectangle)就是要定义两个Rectangle对象相加,需要使用操作符+号对其进行重载。
看看实现吧。
Rectangle::Rectangle(int a,int b)
{
cout << "Rectangle construct..." << endl;
x = a;
y = b;
}
Rectangle Rectangle::operator +(Rectangle re)
{
Rectangle temp(0,0);
temp.setX(x+re.getX());
temp.setY(y+re.getY());
return temp;
}
int Rectangle::area()
{
return x*y;
}
Rectangle::~Rectangle()
{
cout << "Rectangle deconstruct.." << endl;
}
在操作符重载的实现里面,我们定义了一个临时变量来保存两个Rectangle对象相加的结果。最后返回。
这里有一个问题,我目前没有想清楚,当两个Rectangle相加的时候,这个temp对象是什么时候构造和析构的。请过路的高手指示一下。
写了一个测试main方法:
int main()
{
Rectangle r(5,6);
Rectangle rect(3,4);
cout << "r's size is :" << r.area() << endl;
cout << "rect's size is: " << rect.area() << endl;
Rectangle sum = r + rect;
cout << sum.area() << endl;
return 0;
} 计算结果如下:
将两个Rectangle对象的x相加,y相加,然后乘积,(5+3)*(6+4)=80。和程序计算出来结果一样。
同时,这里我们在代码中使用r+rect的时候,操作符计算的时候会有一个中间变量,这个中间变量的构造析构又是个什么情况呢?
操作符重载,和函数重载是一个道理,就是说一个操作符可以根据需要,我们自己定义它的算法。在c++语言支持的范围里面,操作符都仅支持基本类型的计算。如果要让操作符支持我们自己定义的类运算,就需要使用操作符重载了。
来看看吧,我们上一节的例子中,定义了Rectangle类,里面有两个变量。如果要定义两个Rectangle类的加法,肿么办?先看看操作符重载的基本定义方法吧。
type operator sign (parameters);
type:就是返回的类型。计算了右值,就需要有个左值来实现赋值计算呀。
operator :表示的是操作符的意思,定义的时候,用这个表示我们要进行操作符重载啦。
sign:表示要重载的操作符。比如+,-,*,/等。
parameters:表示参与操作的另外一方。
上面这个解释我尽量用了比较简单的说明,但是如果没有例子,还是很抽象,我这里就写一个Rectangle相加的例子吧。看代码,将上个例子的Rectangle的类定义改为如下的:
class Rectangle
{
private:
int x;
int y;
public:
Rectangle(int,int);
~Rectangle();
int area();
Rectangle operator + (Rectangle);
int getX(){return x;}
int getY(){return y;}
void setX(int a){x = a;}
void setY(int b){y = b;}
};
其中Rectangle operator +(Rectangle)就是要定义两个Rectangle对象相加,需要使用操作符+号对其进行重载。
看看实现吧。
Rectangle::Rectangle(int a,int b)
{
cout << "Rectangle construct..." << endl;
x = a;
y = b;
}
Rectangle Rectangle::operator +(Rectangle re)
{
Rectangle temp(0,0);
temp.setX(x+re.getX());
temp.setY(y+re.getY());
return temp;
}
int Rectangle::area()
{
return x*y;
}
Rectangle::~Rectangle()
{
cout << "Rectangle deconstruct.." << endl;
}
在操作符重载的实现里面,我们定义了一个临时变量来保存两个Rectangle对象相加的结果。最后返回。
这里有一个问题,我目前没有想清楚,当两个Rectangle相加的时候,这个temp对象是什么时候构造和析构的。请过路的高手指示一下。
写了一个测试main方法:
int main()
{
Rectangle r(5,6);
Rectangle rect(3,4);
cout << "r's size is :" << r.area() << endl;
cout << "rect's size is: " << rect.area() << endl;
Rectangle sum = r + rect;
cout << sum.area() << endl;
return 0;
} 计算结果如下:
将两个Rectangle对象的x相加,y相加,然后乘积,(5+3)*(6+4)=80。和程序计算出来结果一样。
同时,这里我们在代码中使用r+rect的时候,操作符计算的时候会有一个中间变量,这个中间变量的构造析构又是个什么情况呢?
相关文章推荐
- C++学习笔记-操作符重载
- c++学习笔记(9.操作符重载)
- C++学习之友元函数,操作符重载
- c++基础学习9-c++中的操作符重载
- C++学习笔记(七)--操作符重载 友元函数 类的继承 访问控释protected
- C++ ->操作符重载的思考 (Boolan学习笔记第八周)
- C++ 学习之操作符重载
- C++学习 - 操作符重载
- C++学习笔记--数组操作符重载
- C++学习笔记9-操作符重载
- 操作符重载——C/C++学习笔记
- c++入门学习(操作符重载)
- C++入门学习笔记(三)--类的操作符重载
- C++基础学习笔记----第十二课(操作符重载-上)
- C++基础学习笔记----第十三课(操作符重载-下)
- C++学习之操作符重载
- C++学习-------类继承之友元和操作符重载
- C++拓展笔记3-1:三类操作符重载学习总结
- C++基础学习笔记----第十三课(操作符重载-下)
- C++之操作符重载和友元学习笔记