C++的算符重载[VC/C++编程]
本文“C++的算符重载[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
算符重载的作用是什么?它答应你为类的用户供应一个直觉的接口. 算符重载答应C/C++的运算符在用户定义范例(类)上拥有一个用户定义的意义.重载的算符是函数调用的语法修饰:
class Fred {
public: // …
};
#if 0 // 没有算符重载:
Fred add(Fred, Fred);
Fred mul(Fred, Fred);
Fred f(Fred a, Fred b, Fred c)
{
return add(add(mul(a,b), mul(b,c)), mul(c,a)); // 哈哈,多好笑…
}
#else // 有算符重载:
Fred operator+ (Fred, Fred);
Fred operator* (Fred, Fred);
Fred f(Fred a, Fred b, Fred c)
{
return a*b + b*c + c*a;
}
#endif
算符重载的好处是什么?
通太重载类上的尺度算符,你可以发掘类的用户的直觉.使得用户程序所用的语言是面向问题的,而不是面向机械的. 终究目标是降低学习曲线并削减错误率.
有什么算符重载的实例?这里有一些算符重载的实例:
myString + yourString 可以衔接两个 std::string 对象
myDate++ 可以增添一个 Date 对象
a * b 可以将两个 Number 对象相乘
a[i] 可以拜候 Array 对象的某个元素
x = *p 可以反引用一个实际“指向”一个磁盘记录的 "smart pointer" —— 它实际上在磁盘上定位到 p 所指向的记录并返回给x.
但是算符重载使得我的类很丑陋;莫非它不是应当使我的类更清楚吗?算符重载使得类的用户的工作更简易,而不是为类的开辟者服务的! 考虑一下以下的例子:
class Array {
public:
int& operator[] (unsigned i);
};
inline
int& Array::operator[] (unsigned i)
{ // …
}
有些人不喜好operator关键字或类体内的有些古怪的语法.但是算符重载语法不是被盼望用来使得类的开辟者的工作更简易.它被盼望用来使得类的用户的工作更简易:
int main()
{
Array a;
a[3] = 4; // 用户代码应当明显并且易懂…
}
记着:在一个面向重用的世界中,利用你的类的人有很多,而制作它的人只有一个(你自己);因此你做任何事都应当照护大都而不是少数.
什么算符能/不能被重载?大大都都可以被重载.C的算符中只有 . 和 ? :(以及sizeof,技术上可以看做一个算符).C++增添了一些自己的算符,除了::和.*,大大都都可以被重载. 这是一个下标算符的示例(它返回一个引用).先没有算符重载:
class Array {
public:
int& elem(unsigned i) { if (I > 99) error(); return data[i]; }
private:
int data[100];
};
int main()
{
Array a;
a.elem(10) = 42;
a.elem(12) += a.elem(13);
}
目前用算符重载给出一样的逻辑:
class Array {
public:
int& operator[] (unsigned i) { if (I > 99) error(); return data[i]; }
private:
int data[100];
};
int main()
{
Array a;
a[10] = 42;
a[12] += a[13];
}
我能重载 operator== 以便对比两个 char[] 来举行字符串对比吗?不行:被重载的算符,至少一个操作数必须是用户定义范例(大大都时刻是类). 但即便C++答应,也不要这样做.因为在此处你应当利用近似 std::string的类而不是字符数组,因为数组是有害的.因此无论若何你都不会想那样做的.
我能为“幂”运算成立一个 operator** 吗?不行. 运算符的名称、优先级、结合性以及元数都是由语言固定的.在C++中没有operator**,因此你不能为类范例成立它.
假如还有疑问,考虑一下x ** y与x * (*y)平等(换句话说,编译器假定 y 是一个指针).此外,算符重载只不过是函数调用的语法修饰.固然这种特别的语法修饰非常美好,但它没有增添任何本质的东西.我倡议你重载pow(base,exponent)(双精度版本在中).
趁便提一下,operator^可以成为幂运算,只是优先级和结合性是错误的.
如作甚Matrix(矩阵)类成立下标运算符? [Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]
以上是“C++的算符重载[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:<b>二叉树实现源代码</b>
- ·下一篇文章:C++的类和类的定义
- ·中查找“C++的算符重载”更多相关内容
- ·中查找“C++的算符重载”更多相关内容