1.重载的限制:
1)重载后的操作符必须至少有一个操作数是用户自定义的类型,这可以防止用户把标准操作符给重载。
比如 T operator-(double a,double b)//ERROR
2)不能违反原来操作符的句法规则。
3)不能定义新的操作符,否则那就不叫重载了。
4)不能重载下面的操作符;
sizeof
.
.*
::
?:
typeid
const_cast
dynamic_cast
reinterpret_cast
static_cast
除上面的操作符外,其他的都可以被重载。
5)调用重载函数时,左侧的操作数是调用对象,比如:
A = B*2.75 将会被编译器转化为下面重载函数的调用
A = B.operator * (2.75)
2.重载操作符与友元
为什么需要友元?在类重载二元操作符时常需要友元。比如还是上面A=B*2.75的例子,乘法交换两个操作数是非常正常的,即B*2.75与2.75*B应该是等价的,而按照重载操作符的规则,左侧的操作数是调用对象,但2.75显然不是,因此当你写2.75*B时,编译器就不知道怎么办了。解决办法是你可以定义下面的非成员函数:
T operator* (double a,T b)
其实现可能是:
{
T c;
c.t = a*b.t;
return c;
}
但这样还不行,因为a无法访问T的私有成员,即a* b.t 是非法的。这时候就需要用到友元了。
friend T operator * (double a,T b);
关于友元函数需要记住两点:
1.虽然友元函数在类声明中声明,但是它不是成员函数,因此不能使用成员操作符来调用。
2.友元函数虽然不是成员函数,但是与成员函数的访问权限相同。
如果要为类重载操作符,并将非类的项作为第一个操作数,则可以使用友元函数来反转操作数的顺序。
最常见的友元函数:重载<<操作符
我们早已经习惯了这样的输出语句:
int i=2;
cout << "i="<<i<<endl;
double d = 2.1;
cout <<"d="<<d<<endl;
cout是ostream的对象,ostream对<<操作符进行了重载,它能够识别所有的c++基本类型,因为对于每种基本类型,ostream都包含其对应的operator<<()的定义,因此我们可以放心地进行语句输出。那如果我们期望用户自定义类型(比如自定义类型 T),我们也期望能够count<<"t="<<t<<endl;(t是T的一个实例),该怎么办?
首先需要在T中重载<<,但这样的话,T将作为第一个操作数,所以就要这样输出T: t << out; 非常怪异。使用有元函数就可以解决这个问题:
friend ostream& operator<<(ostream& os,const T& t);
ostream& operator<<(ostream& os,const T& t)
{
os <<"t="<<t.abc<<endl;
return os;
}
分享到:
相关推荐
在C++编程语言中,重载操作符与转换是两个重要的概念,它们允许程序员自定义基本操作符的行为,以及在不同类型之间进行灵活的转换。在第十四章《C++ Primer》中,作者深入探讨了这些主题,以帮助读者更好地理解和...
【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...
### (21天精通C++)学习笔记:第十天——友元函数与友元类 #### 友元函数 友元函数是一种特殊的非成员函数,它能够访问类的私有(private)和保护(protected)成员。这对于那些需要共享类内部细节、又不想成为类...
本笔记基于 C++ Primer 的学习笔记,涵盖了友元函数、操作符重载、运算符重载、using 声明和引用等多个知识点。 友元函数 友元函数是一种特殊的函数,它可以访问类的私有成员。通过让函数成为类的友元,赋予该函数...
接下来,操作符重载是C++中一个特殊的特性,它允许开发者自定义运算符对自定义类型的操作行为。例如,我们可以重载加号运算符(+)使其能够进行两个自定义对象的相加操作。操作符重载可以提高代码的可读性和易用性,...
运算符允许在类中重载C#操作符以适用于特定类型,而索引器则允许对象像数组那样被索引。 通过以上分析可知,C#高级编程学习笔记中所包含的知识点对于深入理解这门语言至关重要。枚举的使用可以让代码更清晰、易于...
8. **内存管理**:C++允许程序员直接管理内存,通过new和delete操作符进行动态内存分配和释放。理解内存泄漏和野指针问题及其预防是学习C++的重要部分。 9. **预处理器宏**:预处理器宏虽然强大,但使用不当可能...
《千锋C++笔记》是一份综合性的学习资料,涵盖了C++编程语言的基础到高级概念。这份笔记由知名教育机构“千锋”提供,旨在帮助初学者和有一定基础的程序员深入理解和掌握C++这一强大的系统级编程语言。下面将详细...
本学习笔记主要围绕Visual C++的各个方面展开,包括基础语法、MFC(Microsoft Foundation Classes)框架、GUI编程、内存管理、异常处理、多线程以及调试技巧等关键知识点。 1. **C++基础语法**:Visual C++支持标准...
【C++(VS2019)学习笔记】 在C++编程语言的学习过程中,Visual Studio 2019(简称VS2019)是一个常用的集成开发环境(IDE)。它提供了丰富的功能,如代码编辑、调试、构建工具等,使得C++的开发更加便捷高效。以下...
《C++ Primer 第4版》是一本经典的C++编程...这份“C++ Primer 第4版”学习笔记包含了所有这些知识点的详细解释和示例,是深入学习C++的理想资料。通过学习和实践,你可以掌握C++编程的基础,并逐步提升到高级水平。
#### 四、操作符重载 - **概念**:通过重载同一操作符使其具有不同的含义。 - **例子**: - `&` 可以表示取地址操作符,也可以表示按位与操作符。 - 指针解引用操作符 `*` 也可以通过重载来扩展其功能。 #### 五...
根据提供的文件信息,我们可以推断出这是一份关于C++程序设计的学习资料,具体来说是《C++程序设计教程第二版》这本书的学习笔记。虽然给定的部分内容仅包含了一些图片占位符和数字(可能是指页码),但我们可以基于...
**VC++深入详解学习笔记** 在编程领域,Visual C++(简称VC++)是Microsoft公司开发的一款集成开发环境,主要用于编写使用C++语言的应用程序。它不仅提供了编译器,还包括了调试器、资源编辑器等工具,为开发者提供...
### C++核心编程学习笔记知识点概述 #### 一、内存分区模型 在C++中,内存被分为四个主要部分:代码区、全局区、栈区和堆区。 1. **代码区**: - **作用**:存放函数体的二进制代码。 - **特点**:由操作系统...
- 深入理解动态内存分配(new和delete操作符)和栈与堆的区别,以及如何避免内存泄漏,这对于优化程序性能和防止错误至关重要。 6. **C++11新特性**: - C++11是C++的一个重要更新,引入了如右值引用、lambda...
在结构化方法中,使用了`iostream`库进行输入输出,通过`cout`和`cin`操作符重载功能。而在面向对象方法中,创建了`Circle`类,包含半径、周长和面积的计算方法,体现了类的封装、实例化以及成员变量和成员函数的...
### C++学习笔记知识点梳理 #### 一、开始 C++是一种高级编程语言,它是在C语言的基础上发展起来的,并且增加了面向对象编程的支持。学习C++的第一步是从熟悉其基本语法开始,然后逐渐深入理解面向对象编程的概念...