编写高质量代码——运算符重载,是成员函数还是友元函数

一、运算符重载的四项基本原则:

▍不可臆造运算符。

▍运算符原有操作数的个数、优先级和结合性不能改变。

▍操作数中至少一个是自定义类型。

▍保持运算符的自然含义。

==============================

二、运算符重载的两种形式:

▍成员函数形式(隐含一个参数 this 指针):

1)双目运算符:参数一个

2)单目运算符:不能显示的声明参数

▍友元函数形式(不存在隐含的参数 this 指针)

1)双目运算符:两个参数

2)单目运算符:一个参数

==============================

三、成员函数和友元函数形式的另一差异:

1)友元函数形式:能够接受左参数和右参数的隐式转换

2)成员函数形式:只允许右参数的隐式转换

例如:

class CString{

   public :

      CString(char* str);

      ...

   private :

      char* m_pStr;

};

=.=CString的构造函数参数为一个char:

友元函数形式的 operator+(const CString&,const CString&),char+CString和CString+char都能正常工作;

成员函数形式的 CString::operator(const CString& rhs),只能执行 CString+char。

--------------------------------

隐式转换由于临时变量的增加,效率不高,建议定义多个运算符的友元重载版本:

CString& operator+(const CString&, const CString&); 

CString& operator+(const char&, const CString&);

CString& operator+(const CString&, const char&);

==============================

四、一般而言,双目运算符,最好重载为友元函数;对于单目运算符,最好重载为成员函数。

特例:

1)只能重载为成员函数:“=”、“()”、“[ ]”、“->”等,与 this(自身)关联太多。

2)只能重载为友元函数:只能重载为友元函数:输出运算符 << ,第一个操作符一定是 ostream 。

friend ostream& operator<<(ostream& out, const Complex& c);

编写高质量代码——运算符重载,是成员函数还是友元函数

时间: 2024-11-08 04:20:18

编写高质量代码——运算符重载,是成员函数还是友元函数的相关文章

编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符

建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; 而不是用下面的语法来完成一样的事情: int x = 1; int y = 2; int total = int.Add(x, y); 同理,在构建自己的类型时,我们应该始终考虑该类型是否可以用于运算符重载.如果考虑类型Salary,下面的这段代码看起来就不是那么舒服了: Salary mikeIn

编写高质量代码——重载operator=的标准三步走

CString& CString::operator=(const CString& str){   if(this == &str)       //1.自赋值检查       return *this;          if(pChar!=NULL)       //2.释放原有空间     delete[]  pCahr;   pChar = new char[strlen(str.pChar)+1]; // 2.申请新空间   strcpy(pChar, str.pCha

编写高质量代码——“零星”总结

不要让main函数返回void //在C++中绝对没有出现过 void main(){  }这样的函数定义,在C语言中也是. //两种 main 的定义方式:int main( void ); //                     int main( int argc, char** argv ) //第一版的C语言中只有 int 一种数据类型,为了兼容 需要,不明确标明返回值的,默认为 int //在main函数中,return 语句的作用在于离开main函数(析构掉所有具有动态生存时

编写高质量代码——“零星”总结(续3)

明白在C++中如何使用C C++中使用C的程序库,实现C++和C的混合编程:extern "C" { /* code */ }一定要加在C++的代码文件中才能起作用. //C编译器编译函数时不带函数的类型信息,只包含函数符号名字:而C++编译器为了实现函数重载,在编译时会带上函数的类型信息.extern "C"的作用:告诉C++链接器寻找调用函数的符号时,采用C的方式. =================================== 使用memcpy()系列

编写高质量代码之改善C++程序语法篇2&lt;从C到C++需要做的改变&gt;

偶然发现网络读书频道,http://book.51cto.com/art/201202/317549.htm,挺不错的希望CSDN也有,可能已经有了... 阅读<编写高质量代码--改善C++程序的150个建议>,总结归纳: 此文用以加深记忆,督促学习的目的 0  在C++中如何使用C的代码 如:int func( int a, char b); c编译函数时不带函数的类型信息,上面的函数被编译成类似_Func的符号 c++为了实现重载,在编译时会加上函数的参数类型,上面的函数会被编译成类似_F

编写高质量代码——“零星”总结(续2)

newdelete与new[]delete[]必须配对使用 //注意,由于内置数据类型没有构造.析构函数,所以针对内置数据类型时,释放和内存使用delete或delete[]的效果是一样的. 例如: int *pArray = new int[10]; ...//processing code delete pArray;  //等同于delete[] pArray; 虽然针对内置类型,delete和delete[]都能正确地释放所申请的内存空间,但是如果申请的是一个数组,建议还是使用delet

编写高质量代码改善C#程序的157个建议——建议2: 使用默认转型方法

建议2: 使用默认转型方法 除了字符串操作外,程序员普遍会遇到的第二个问题是:如何正确地对类型实现转型.在上一个建议中,从int转型为string,我们使用了类型int的ToString方法.在大部分情况下,当需要对FCL提供的类型进行转型时,都应该使用FCL提供的转型方法. 这些转型方法包括: 使用类型的转换运算符. 使用类型内置的Parse.TryParse,或者如ToString.ToDouble和ToDateTime等方法. 使用帮助类提供的方法. 使用CLR支持的转型. 下面分别对这些

编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式

建议27:在查询中使用Lambda表达式 LINQ实际上是基于扩展方法和Lambda表达式的.任何LINQ查询都能通过扩展方法的方式来代替. var personWithCompanyList = from person in personList select new { PersonName = person.Name, CompanyName = person.CompanyID==0?"Micro":"Sun" }; foreach (var item in

编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果

建议26:使用匿名类型存储LINQ查询结果 从.NET3.0开始,C#开始支持一个新特性:匿名类型.匿名类型有var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性: 即支持简单类型也指出复杂类型.简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项. 匿名类型的属性是只读的,没有属性设置器,它一旦被初始化就不可更改. 如果两个匿名类型的属性值相同,那么就认为这两个匿名类型相等. 匿名类型可以再循环中用作初始化器. 匿名类型支持智能感知. 匿名