当前位置:首页 >> 文学研究 >>

6-c++运算符重载


第6章

运算符重载

6.1

运算符重载规则

6.2
6.3 6.4 小结

用成员或友员函数重载运算符
几个典型运算符重载 类类型转换

华南理工大学计算机学院 周霭如 2004

第6章

运算符重载
? ?

运算符重载使得用户自定义的数据以一种更简洁的方式工作 能表示为
例如
int x , y ; y=x+y; complex c1 , c2 ; c1 = Cadd (c1 , c2 ) ;

c1 = c1 + c2 ;

// 复数类对象

定义 能表示为 运算符重载函数 ; m1 = m1 + m2

// 调用函数计算两个复数的和

matrix m1 , m2 ;
m2 = Madd ( m1 , m2 ) ;

// 矩阵类对象
// 调用函数计算两个矩阵的和

华南理工大学计算机学院 周霭如 2004

6.1
6.1.1

运算符重载规则
重载运算符的限制

可以重载的运算符
+ ! ^= <= [] = &= >= () * < |= && new / > << || delete % += >> ++ new[] ^ -= >>= -delete[] & *= <<= ->* | /= == ‘ ~ % != ->

不能重载的算符
. :: .* ?: sizeof

华南理工大学计算机学院 周霭如 2004

6.1
6.1.1

运算符重载规则
重载运算符的限制

重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:

?不改变运算符的优先级
?不改变运算符的结合性

?不改变运算符所需要的操作数
?不能创建新的运算符

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{ // 相对于该类定义的操作

}

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{ // 相对于该类定义的操作
函数返回类型

}

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{ // 相对于该类定义的操作
重载该运算符的类

}

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{ // 相对于该类定义的操作
被重载的运算符

}

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{ // 相对于该类定义的操作
关键字

}

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{ // 相对于该类定义的操作
函数名

}

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{
运算符要求的操作数

// 相对于该类定义的操作

}

华南理工大学计算机学院 周霭如 2004

6.1.2

运算符重载的语法形式

? 运算符函数是一种特殊的成员函数或友员函数 ? 成员函数的语法形式为:

类型 类名 :: operator op ( 参数表 )
{ // 相对于该类定义的操作

}
? 一个运算符被重载后,原有意义没有失去,只是定义了相对 一特定类的一个新运算符

华南理工大学计算机学院 周霭如 2004

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

重载了 3个算符

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

重载了 3个算符

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator :: operator ++ () void Calculator::operator ++ () { if ( value (< 65535 ) value ++++ ; { if value < 65535 ) value ; else else { cout << "\nData overflow !" << endl { cout << "\nData overflow !" << endl ;; abort() ; abort()} ; } } void Calculator::operator --() }
{ if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: 使用 unsigned int value; }; 系统预定义版本 void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator :: operator ++ () void Calculator::operator ++ () { if ( value (< 65535 ) value ++ ; ; { if value < 65535 ) value ++ else else { cout << "\nData overflow !" << endl { cout << "\nData overflow !" << endl ;; abort() ; abort()} ; } } void Calculator::operator --() }
{ if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } Calculator :: operator -- () } void Calculator::operator --() { if ( value > 0 ) value -- ; else

void

{ if ( value > 0 ) value -- ; else

{ cout <<cout << "\n Data overflow !"<< endl; ; { "\n Data overflow !" << endl
abort() ; abort() ;

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

}
}

} } unsigned int Calculator::operator() ()

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; 使用 void operator ++ () ; void operator -- () ; 系统预定义版本 unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } Calculator :: operator -- () } void Calculator::operator --() { if ( value > 0 ) value -- ; else

void

{ if ( value > 0 ) value -- ; else

{ cout <<cout << "\n Data overflow !"<< endl; ; { "\n Data overflow !" << endl
abort() ; abort() ;

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

}
}

} } unsigned int Calculator::operator() ()

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ; voidoperator ++ ()++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ )

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --()

调用重载版本 ( value > 0 ) value -- ; { if
else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

++ Counter; { ++ Counter;
cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ; voidoperator ++ ()++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ )

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --()

调用重载版本 ( value > 0 ) value -- ; { if
else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

++ Counter; { ++ Counter;
cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ; voidoperator ++ ()++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter; Counter.operator++() } for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --()

调用重载版本 ( value > 0 ) value -- ; { if
else { cout << "\n Data overflow !" << endl ;


} }

abort() ;

cout << "\n Counter = " << Counter() ;

unsigned int Calculator::operator() ()

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator voidoperator -- () ;-- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter; } for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; -- Counter; cout << "\n Counter = " << Counter() ;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;

调用重载版本

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator voidoperator -- () ;-- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter; } for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; -- Counter; cout << "\n Counter = " << Counter() ;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;

调用重载版本

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator voidoperator -- () ;-- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter; } for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; Counter.operator--()

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;

调用重载版本



{ return value ; }

cout << "\n Counter = " << Counter() ;

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; void operator () ()();; unsigned int operator() private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ; 调用重载版本
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter;

{ return value ; }

Counter cout << "\n Counter = " << Counter() ; ()
}
华南理工大学计算机学院 周霭如 2004

;

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; void operator () ()();; unsigned int operator() private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ;

被重载的运算符

else

{ cout << "\n Data overflow !" << endl ; abort() ; }

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; }

unsigned int Calculator::operator() ()

{ return value ; }

Counter cout << "\n Counter = " << Counter() ; ()
}
华南理工大学计算机学院 周霭如 2004

;

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; void operator () ()();; unsigned int operator() private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --()

函数参数表 else

{ if ( value > 0 ) value -- ; { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter;

{ return value ; }

Counter Counter. operator() cout << "\n Counter = " << Counter() ; () ;
}
华南理工大学计算机学院 周霭如 2004

() ;

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.1.2 运算符重载的语法形式

#include<iostream.h> #include<stdlib.h> class Calculator { public: Calculator() { value = 0 ; } ; void operator ++ () ; void operator -- () ; unsigned int operator() () ; private: unsigned int value; }; void main() { Calculator Counter ;
int i ; for( i = 0 ; i < 5 ; i ++ ) { ++ Counter;

例6-1 设计一个安全计数器
void Calculator::operator ++ () { if ( value < 65535 ) value ++ ; else { cout << "\nData overflow !" << endl ; abort() ; } } void Calculator::operator --() { if ( value > 0 ) value -- ; else { cout << "\n Data overflow !" << endl ; abort() ; } } unsigned int Calculator::operator() ()

cout << "\n Counter = " << Counter() ;
} for( i = 0 ; i <= 5 ; i ++ ) { -- Counter; cout << "\n Counter = " << Counter() ;

{ return value ; }

}
华南理工大学计算机学院 周霭如 2004

}

6.2

用成员或友员函数重载运算符

? 运算符函数可以重载为成员函数或友员函数 ? 关键区别在于成员函数具有 this 指针,友员函数没有this指针 ? 不管是成员函数还是友员函数重载,算符的使用方法相同。但

传递参数的方法不同,实现代码不同,应用场合也不同

华南理工大学计算机学院 周霭如 2004

6.2

用成员或友员函数重载运算符

1.一元运算符
Object op 或 op Object ?重载为成员函数,解释为: Object . operator op () 操作数由对象Object通过this指针隐含传递

?重载为友员函数,解释为:
operator op (Object) 操作数由参数表的参数Object提供
华南理工大学计算机学院 周霭如 2004

6.2

用成员或友员函数重载运算符

2.二元运算符
ObjectL op ObjectR ?重载为成员函数,解释为: ObjectL . operator op ( ObjectR ) 左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递

?重载为友员函数,解释为:
operator op ( ObjectL, ObjectR ) 左右操作数都由参数传递

华南理工大学计算机学院 周霭如 2004

6.2.1

用成员函数重载算符

6.2.1 用成员函数重载算符

? 当一元运算符的操作数,或者二元运算符的左操作数 是该类的一个对象时,定义重载算符函数为成员函数

华南理工大学计算机学院 周霭如 2004

6.2.1

用成员函数重载算符

6.2.1 用成员函数重载算符

例6-2
建立一个描述3维坐标的类 Tri_Coordinates, 重载算符 “+”、“++”、和 “=” ,实现简单的算术运



华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class TriCoor { public: TriCoor( int mx = 0, int my = 0, int mz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; } TriCoor operator = ( TriCoor t ) { x = t.x ; y = t.y ; z = t.z ; return * this ; } TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } void assign( int mx, int my, int mz ) { x = mx; y = my; z = mz; } private: int x, y, z ; // 3_d coordinates };
6.2.1 用成员函数重载算符

例6-2

void main() { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a + b + c ; c.show() ; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class TriCoor { public: TriCoor( operator int TriCoor ) TriCoor int mx = 0, + ( my = 0, inttmz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; { TriCoor temp ; temp.x x+t.x ; temp.y y+t.y ; = this->y+t.y temp.x = = this->x+t.x ;= temp.y temp.z = z+t.z ;; temp.z = this->x+t.z ; return temp return temp ; ; } } TriCoor operator = ( TriCoor t ) { x = t.x ; y = t.y ; z = t.z ; return * this ; } TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } + my; = mz; } void assign( int mx, int my, int mz ) { x ①mx;ay =b ?z a.operator + (b) = private: int x, y, z ; // 3_d coordinates↓ }; Object1
6.2.1 用成员函数重载算符

例6-2

void main() 返回运算结果 { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a ++bb + c ; c.show() ; c=a +c; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

通过匿名对象Object1

#include<iostream.h> class TriCoor { public: TriCoor( operator int TriCoor ) TriCoor int mx = 0, + ( my = 0, inttmz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; { TriCoor temp ; temp.x x+t.x ; temp.y y+t.y ; = this->y+t.y temp.x = = this->x+t.x ;= temp.y temp.z = z+t.z ;; temp.z = this->x+t.z ; return temp return temp ; ; } } TriCoor operator = ( TriCoor t ) { x = t.x ; y = t.y ; z = t.z ; return * this ; } TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } + ? = mz; } void assign( int mx, int my, int mz ) { x ①mx;a y =bmy; za.operator + (b) = private: int x, y, z ; // 3_d coordinates↓ b + c 通过匿名对象Object2 ② a+ }; Object1
6.2.1 用成员函数重载算符

例6-2

返回运算结果

void main() { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a ++bb + c ; c.show() ; c=a +c; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

Object1 + c ? Object1.operator + (c) ↓ Object2

#include<iostream.h> class TriCoor { public: TriCoor( operator int TriCoor ) TriCoor int mx = 0, + ( my = 0, inttmz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; { TriCoor temp ; temp.x x+t.x ; temp.y y+t.y ; = this->y+t.y temp.x = = this->x+t.x ;= temp.y temp.z = z+t.z ;; temp.z = this->x+t.z ; return temp return temp ; ; } } TriCoor operator = ( TriCoor t ) { x = t.x ; y = t.y ; z = t.z ; return * this ; } TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } + ? = mz; } void assign( int mx, int my, int mz ) { x ①mx;a y =bmy; za.operator + (b) = private: int x, y, z ; // 3_d coordinates↓ b + c ② a+ }; Object1
6.2.1 用成员函数重载算符

例6-2

void main() ③ { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a ++bb + c ; c.show() ; c=a +c; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

Object1 + c ? Object1.operator + (c) c = a↓ b + c ; + Object2 c = Object2 ;

#include<iostream.h> class TriCoor { public: TriCoor( 返回调用函数的对象 mz = 0 ) { x = mx ; y = my ; z = mz ; } int mx = 0, int my = 0, int TriCoor operator + ( TriCoor t ) { TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; } TriCoor operator(= ( TriCoor t )= t.x ; y = t.y ; z = t.z ; return * this ; } TriCoor operator = TriCoor t ) { x TriCoor operator ++; ()this->y;=yt.y ;; this->z = t.z*this ; } * this ; } ++ z ++ ; return ; return { this->x = t.x { x ++ void show() { cout << x << " , " << y << " , " << z << "\n"; } void assign( int mx, int my, int mz ) { x = mx; y = my; z = mz; } private: int x, y, z ; // 3_d coordinates };
6.2.1 用成员函数重载算符

例6-2

void main() { TriCoor a( 1, 2, 3 ), b, c② c = b ? c.operator = (b) ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a + b + c ; c.show() ; c=b=a c = b = a ; ; c.show() ; }
华南理工大学计算机学院 周霭如 2004



b = a ? b.operator = (a)

#include<iostream.h> class TriCoor { public: TriCoor( int mx = 0, int my = 0, int mz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; 没有参数 temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; } TriCoor operator = ( TriCoor t ) { x = t.x ; y = t.y ; z = t.z ; return * this ; } TriCoor operator ++ () TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } { this->x ++ ; this->y ++ ; this->z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } void assign( int mx, int my, int mz ) { x = mx; y = my; z = mz; } private: int x, y, z ; // 3_d coordinates };
6.2.1 用成员函数重载算符

例6-2

void main() { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ )++ b; ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a + b + c ; c.show() ; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

++ b ? b.operator ++ ()

#include<iostream.h> 例6-2 class TriCoor 它们 { public: 有何区别? TriCoor( int mx = 0, int my = 0, int mz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; } TriCoor operator TriCoor t ) { x x ; y = t.y TriCoor operator = (= ( TriCoor t )={t.x = t.x ; y;=zt.yt.z ; return * this ; } * this ; } = ; z = t.z ; return TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } void assign( int mx, intint my, mz )mz ) { x = y = my; = my; z}= mz; } void assign( int mx, my, int int { x = mx; mx; y z = mz; private: int x, y, z ; // 3_d coordinates };
6.2.1 用成员函数重载算符

void main() { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a + b + c ; c.show() ; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-2 class TriCoor 可以吗? { public: 如何调用? TriCoor( int mx = 0, int my = 0, int mz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; } TriCoor operator TriCoor t ) { x x ; y = t.y assign TriCoor operator = (= ( TriCoor t )={t.x = t.x ; y;=zt.yt.z ; return * this ; } * this ; } = ; z = t.z ; return TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } void assign( int mx, intint my, mz )mz ) { x = y = my; = my; z}= mz; } void assign( int mx, my, int int { x = mx; mx; y z = mz; private: int x, y, z ; // 3_d coordinates };
6.2.1 用成员函数重载算符

void main() { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a + b + c ; c.show() ; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class TriCoor { public: TriCoor( int mx = 0, int my = 0, int mz = 0 ) { x = mx ; y = my ; z = mz ; } TriCoor operator + ( TriCoor t ) { TriCoor temp ; temp.x = x+t.x ; temp.y = y+t.y ; temp.z = z+t.z ; return temp ; } TriCoor operator = ( TriCoor t ) { x = t.x ; y = t.y ; z = t.z ; return * this ; } TriCoor operator ++ () { x ++ ; y ++ ; z ++ ; return *this ; } void show() { cout << x << " , " << y << " , " << z << "\n"; } void assign( int mx, int my, int mz ) { x = mx; y = my; z = mz; } private: int x, y, z ; // 3_d coordinates };
6.2.1 用成员函数重载算符

例6-2

void main() { TriCoor a( 1, 2, 3 ), b, c ; a.show(); b.show(); c.show(); for( int i = 0; i < 5; i ++ ) ++ b; b.show() ; c.assign( 3, 3, 3 ) ; c = a + b + c ; c.show() ; c = b = a ; c.show() ; }
华南理工大学计算机学院 周霭如 2004

6.2.2

用友员函数重载
6.2.2 用友员函数重载算符

友员函数重载运算符常用于算符的左右操作数类型不同的情况

例如
class Complex { int Real ; int Imag ; public : Complex ( int a ) { Real = a ; Imag = 0 ; } Complex ( int a , int b ) { Real = a ; Imag = b ; } Complex operator + ( Complex ) ; …... }; int f ( ) { Complex z ( 2 , 3 ) , k ( 3 , 4 ) ; z = z + 27 ; z = 27 + z ; …... }
华南理工大学计算机学院 周霭如 2004

6.2.2

用友员函数重载
6.2.2 用友员函数重载算符

友员函数重载运算符常用于算符的左右操作数类型不同的情况

例如
class Complex { int Real ; int Imag ; public : Complex ( int a ) { Real = a ; Imag = 0 ; } Complex ( int a , int b ) { Real = a ; Imag = b ; } Complex operator + ( Complex ) ; …... }; z . operator + ( 27 ) int f ( ) { Complex z ( 2 , 3 ) , k ( 3 , 4 ) ; z = z + 27 ; z = 27 + z ; …... }
华南理工大学计算机学院 周霭如 2004

6.2.2

用友员函数重载
6.2.2 用友员函数重载算符

友员函数重载运算符常用于算符的左右操作数类型不同的情况

例如

调用构造函数 class Complex 将27 转换为 Complex 类常量 { int Real ; int Imag ; public : Complex ( int a ) { Real = a ; Imag = 0 ; } Complex ( int a , int b ) { Real = a ; Imag = b ; } Complex operator + ( Complex ) ; …... }; z . operator + ( 27 ) int f ( ) { Complex z ( 2 , 3 ) , k ( 3 , 4 ) ; z = z + 27 ; z = 27 + z ; …... }

华南理工大学计算机学院 周霭如 2004

6.2.2

用友员函数重载
6.2.2 用友员函数重载算符

友员函数重载运算符常用于算符的左右操作数类型不同的情况

例如
class Complex { int Real ; int Imag ; public : Complex ( int a ) { Real = a ; Imag = 0 ; } Complex ( int a , int b ) { Real = a ; Imag = b ; } Complex operator + ( Complex ) ; …... }; z . operator + ( 27 ) int f ( ) { Complex z ( 2 , 3 ) , k ( 3 , 4 ) ; OK z = z + 27 ; z = 27 + z ; …... }
华南理工大学计算机学院 周霭如 2004

6.2.2

用友员函数重载
6.2.2 用友员函数重载算符

友员函数重载运算符常用于算符的左右操作数类型不同的情况

例如
class Complex { int Real ; int Imag ; public : Complex ( int a ) { Real = a ; Imag = 0 ; } NO Complex ( int a , int b ) { Real = a ; Imag = b ; } 27 ; Complex operator + ( Complex )不是Complex对象 不能调用函数 …... }; int f ( ) 27 . operator + ( z ) { Complex z ( 2 , 3 ) , k ( 3 , 4 ) ; z = z + 27 ; z = 27 + z ; …... }
华南理工大学计算机学院 周霭如 2004

6.2.2

用友员函数重载
6.2.2 用友员函数重载算符

友员函数重载运算符常用于算符的左右操作数类型不同的情况

例如
class Complex { int Real ; int Imag ; public : Complex ( int a ) { Real = a ; Imag = 0 ; } Complex ( int a , int b ) { Real = a ; Imag = b ; } Complex operator + ( Complex ) ; 成员函数重载的“ + ”算符 …... }; 不支持交换律 int f ( ) { Complex z ( 2 , 3 ) , k ( 3 , 4 ) ; z = z + 27 ; z = 27 + z ; …... }
华南理工大学计算机学院 周霭如 2004

6.2.2

用友员函数重载
6.2.2 用友员函数重载算符

? 在第一个参数需要隐式转换的情形下,使用友员函数重载
算符是正确的选择

? 友员函数没有 this 指针,所需操作数都必须在参数表显式
声明,很容易实现类型的隐式转换

?C++中不能用友员函数重载的运算符有
= () [] ->

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class Complex { public: Complex( double r =0, double i =0 ) { Real = r ; Image = i ; } Complex(int a) { Real = a ; Image = 0 ; } void print() const ; friend Complex operator+ ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c ) ; private: double Real, Image ; }; Complex operator + ( const Complex & c1, const Complex & c2 ) { double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; return Complex ( r, i ) ; } Complex operator - ( const Complex & c1, const Complex & c2 ) { double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; } Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() const { cout << '(' << Real << " , " << Image << ')' << endl ; }
6.2.2 用友员函数重载算符

例6-3 复数运算

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-3 class Complex { public: Complex( double r =0, double i =0 ) { Real = r ; Image = i ; } Complex(int a) { Real = a ; Image = 0 ; } void print() const ; friend Complex operator+ Complex Complex Complex & c2 )Complex friend Complex operator+ ( const ( const & c1, const & c1, const ; friend Complex operator- ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c ) ; private: double Real, Image ; }; Complex operator + ( const Complex Complex & c2 ) Complex operator + ( const Complex & c1, const& c1, const Complex & c2 ) { double r =r = c1.Real + c2.Real ; =double i = c1.Image+c2.Image ; { double c1.Real + c2.Real ; double i c1.Image+c2.Image ; return Complex ( r, i ) ; return Complex ( r, i ) ; } } Complex operator - ( const Complex & c1, const Complex & c2 ) { double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; 构造返回对象 } Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() const { cout << '(' << Real << " , " << Image << ')' << endl ; }
6.2.2 用友员函数重载算符

复数运算

& c2 ) ;

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-3 class Complex { public: Complex( double r =0, double i =0 ) { Real = r ; Image = i ; } Complex(int a) { Real = a ; Image = 0 ; } void print() const ; friend Complex operator+ ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- const & c1, const Complex & c2 ) ; friendComplex operator- ( const(ComplexComplex & c1, const Complex & friend Complex operator- ( const Complex & c ) ; private: double Real, Image ; }; Complex operator + ( const Complex & c1, const Complex & c2 ) { double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; return Complex ( r, i ) ; } Complex operator - ( const Complex & c1, const Complex & c2 ) Complex operator - ( const Complex & c1,double i = c1.Image - c2.Image ; { double r = c1.Real - c2.Real ; const Complex & c2 ) { double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; return Complex ( r, i ) ; } } Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() const { cout << '(' << Real << " , " << Image << ')' << endl ; }
6.2.2 用友员函数重载算符

复数运算

c2 ) ;

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-3 class Complex { public: Complex( double r =0, double i =0 ) { Real = r ; Image = i ; } Complex(int a) { Real = a ; Image = 0 ; } void print() const ; friend Complex operator+ ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c ) ; friend Complex operator- ( const Complex & c ) ; private: double Real, Image ; }; Complex operator + ( const Complex & c1, const Complex & c2 ) { double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; 单目 “ - ” 运算 return Complex ( r, i ) ; } Complex operator - ( const Complex & c1, const Complex & c2 ) { double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; } Complex operator- ( const Complex & c ) Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() const { cout << '(' << Real << " , " << Image << ')' << endl ; }
6.2.2 用友员函数重载算符

复数运算

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class Complex { public: Complex( double r =0, double i =0 ) { Real = r ; Image = i ; } Complex(int a) { Real = a ; Image = 0 ; } void print() const ; void print() const ; friend Complex operator+ ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c1, const Complex & c2 ) ; friend Complex operator- ( const Complex & c ) ; private: double Real, Image ; }; 成员函数 Complex operator + ( const Complex & c1, const Complex & c2 ) { double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; return Complex ( r, i ) ; } Complex operator - ( const Complex & c1, const Complex & c2 ) { double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; } Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() void Complex :: print() const const { cout << '(' << Real Real, << " , " << Image << } << endl ; } { cout << '(' << << " " << Image << ')' << endl ; ')'
6.2.2 用友员函数重载算符

例6-3 复数运算

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-3 复数运算 class Complex { public: void main() Complex( double r =0, double i =0 ) { Real = r ; Image = i ; } { Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; Complex(int a) { Real = a ; Image = 0 ; } Complex c ; void print() const ; friend Complex operator+ ( const Complex & c1, const = c1 - c2 ;c2 ) ; // operator-(c1,c2) c Complex & friend Complex operator- ( const Complex & c1, const Complex & c2 ) ; c.print() ; friend Complex operator- ( const Complex & c ) ; c = 25 + c2 ; // operator+(25,c2) private: c.print() ; double Real, Image ; }; c = c2 + 25 ; // operator+(c2,52) Complex operator + ( const Complex & c1, const Complex & c2 ) c.print() ; { double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; c = - c1 ; // operator-(c1) return Complex ( r, i ) ; } c.print() ; Complex operator - ( const Complex & c1, const Complex & c2 ) } { double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; } Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() const { cout << '(' << Real << " , " << Image << ')' << endl ; }
6.2.2 用友员函数重载算符

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class Complex { public: void main() Complex( double r =0, double i =0 ) { Real = r ; Image = i ; }
6.2.2 用友员函数重载算符

例6-3 复数运算 构造形参对象

把整型常数25转换成 { Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; 复数对象(25,0) Complex(int a) { Real = a ; Image = 0 ; } Complex c ; void print() const ; friend Complex operator+ ( const Complex & c1, const = c1 - c2 ;c2 ) ; // operator-(c1,c2) c Complex & friend Complex operator- ( const Complex & c1, const Complex & c2 ) ; c.print() ; friend Complex operator- ( const Complex & c ) ; c = 25 + c2 ; // operator+(25,c2) private: c.print() ; double Real, Image ; }; c = c2 + 25 ; // operator+(c2,52) Complex operator + ( const Complex & c1, const Complex & c2 ) c.print() ; { double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; c = - c1 ; // operator-(c1) return Complex ( r, i ) ; c.print() ; } Complex operator - ( const Complex & c1, const Complex & c2 ) }
{ double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; } Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() const { cout << '(' << Real << " , " << Image << ')' << endl ; }
华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-3 复数运算 class Complex { public: void main() Complex( double r =0, double i =0 ) { Real = r ; Image = i ; } { Complex c1( 2.5,3.7 ), c2( 4.2, 6.5 ) ; Complex(int a) { Real = a ; Image = 0 ; } Complex c ; void print() const ; friend Complex operator+ ( const Complex & c1, const = c1 - c2 ;c2 ) ; // operator-(c1,c2) c Complex & friend Complex operator- ( const Complex & c1, const Complex & c2 ) ; c.print() ; friend Complex operator- ( const Complex & c ) ; c = 25 + c2 ; // operator+(25,c2) private: c.print() ; double Real, Image ; }; c = c2 + 25 ; // operator+(c2,52) Complex operator + ( const Complex & c1, const Complex & c2 ) c.print() ; { double r = c1.Real + c2.Real ; double i = c1.Image+c2.Image ; c = - c1 ; // operator-(c1) return Complex ( r, i ) ; } c.print() ; Complex operator - ( const Complex & c1, const Complex & c2 ) } { double r = c1.Real - c2.Real ; double i = c1.Image - c2.Image ; return Complex ( r, i ) ; } Complex operator- ( const Complex & c ) { return Complex ( -c.Real, - c.Image ) ; } void Complex :: print() const { cout << '(' << Real << " , " << Image << ')' << endl ; }
6.2.2 用友员函数重载算符

华南理工大学计算机学院 周霭如 2004

使用友员重载算符的讨论
6.2.2 用友员函数重载算符

? 用友员函数重载像“++”这样的运算符时,有时会碰到问题。 例如,类 TriCoor 用成员函数重载“+ +”的版本是: TriCoor :: TriCoor operator ++ ()

{ x ++ ; y ++ ; z ++ ; return *this ; } // ok , 修改了this 指针所指对象

? 用成员函数重载一元算符时,所需要的唯一变元通过 this 指针传递, 对 this 所指对象数据的任何改变都会影响到激活运算符函数的对象

华南理工大学计算机学院 周霭如 2004

使用友员重载算符的讨论
6.2.2 用友员函数重载算符

1. 若定义友员函数 friend operator ++( ) 版本: TriCoor operator ++ (TriCoor opl ) { opl . x ++ ; opl . y ++ ; opl . z ++ ; return opl ; }

问题
函数使用传值参数,对 opl 的所有修改都无法传到函 数体外,不会影响被调用的对象

华南理工大学计算机学院 周霭如 2004

使用友员重载算符的讨论
6.2.2 用友员函数重载算符

2. 用指向激活对象的指针定义友员函数:
TriCoor operator ++ ( TriCoor * opl ) { opl -> x ++ ; opl -> y ++ ; opl -> z ++ ; return *opl ; }

二义性

问题

对 ob 的地址进行递加? 还是 C++ 不知道如何激活该函数,下述代码无法编译: 递加? 将对象 ob TriCoor ob ( 1 , 2 , 3 ) ; & ob ++ ; // error

华南理工大学计算机学院 周霭如 2004

使用友员重载算符的讨论
6.2.2 用友员函数重载算符

3. 使用引用参数: TriCoor operator ++ ( TriCoor & opl ) { opl . x ++; opl . y ++; opl . z ++; return opl ; } 下述代码是正确的: TriCoor ob ( 1 , 2 , 3 ) ; ob ++; // ok,传名

如果一个运算符的操作要修改类的对象的状态,要重载为友员函数
时,应该使用引用参数。

华南理工大学计算机学院 周霭如 2004

使用友员重载算符的讨论
6.2.2 用友员函数重载算符

? 若一运算符的操作需要修改类对象状态时,应该用成员函数重载:

需要左值操作数的运算符(如 =,*=,++)
重载为友员函数时要用引用参数 ? 如果运算符的操作数(尤其是第一个操作数)希望有隐式转换,则 必须用友员函数重载

华南理工大学计算机学院 周霭如 2004

6.3

几个典型运算符重载
6.3 几个典型运算符重载

? 数学类中常用的几个运算重载的特点和应用

华南理工大学计算机学院 周霭如 2004

6.3.1
设 A Aobject ;
6.3.1 重载++与--

重载 ++ 与 --

运算符 ++和 - - 有两种方式:

前置方式:

++Aobject

--Aobject
A :: A operator++ () ; Aobject . operator ++( ) ;

一元 成员函数 重载 解释为:

友员函数 重载 伪参数 friend A operator++ (A &) ;
解释为: operator ++( Aobject ) ; Aobject -A :: A operator++ (int) ; Aobject . operator ++( 0 ) ; friend A operator++ (A &, int) ;

后置方式:

Aobject ++

二元 成员函数 重载 解释为:

友员函数 重载:
解释为:
华南理工大学计算机学院 周霭如 2004

operator++(Aobject, 0)

#include<iostream.h> 例6-4 class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; Increase operator ++ ( ) ; // 前置 Increase operator ++ ( int ) ; // 后置 private: unsigned value ; }; Increase Increase :: operator ++ ( ) { value ++ ; return *this ; } Increase Increase :: operator ++ ( int ) { Increase temp; temp.value = value ++ ; return temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

成员函数重载++

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-4 成员函数重载++ class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; Increase operator ++ ( ++ ( ) ; // 前置 Increase operator ) ; 预定义版本 Increase operator ++ ( int ) ; // 后置 private: unsigned value ; }; Increase Increase :: operator ++ ( ) ++ ( ) Increase Increase :: operator {{value ++ ; return *this * } value ++ ; return ; this ; } Increase Increase :: operator ++ ( int ) { Increase temp; temp.value = value ++ ; return temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; ; ++ n cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-4 成员函数重载++ class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; Increase operator ++ ( ++ ( ) ; // 前置 Increase operator ) ; Increase operator ++ ( int ) ; // 后置 private: unsigned value ; }; Increase Increase :: operator ++ ( ) ++ ( ) Increase Increase :: operator 重载版本 {{value ++ ; return *this * } value ++ ; return ; this ; } Increase Increase :: operator ++ ( int ) { Increase temp; temp.value = value ++ ; return temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; ; ++ n cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-4 成员函数重载++ class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; Increase operator ++ ( ) ; // 前置 预定义版本 Increase operator int ; // Increaseoperator ++ (++ () int ) ; 后置 private: unsigned value ; }; Increase Increase :: operator ++ ( ) { value ++ ; return *this ; } Increase Increase :: operator ++ Increase Increase :: operator ++ ( int ) ( int ) { Increase temp; temp.value = ++ ; ++ ; return { Increase temp; temp.value = value valuereturn temp; } temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n n ++ ; ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-4 成员函数重载++ class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; Increase operator ++ ( ) ; // 前置 Increase operator int ; // Increaseoperator ++ (++ () int ) ; 后置 private: unsigned value ; 重载版本 }; Increase Increase :: operator ++ ( ) { value ++ ; return *this ; } Increase Increase :: operator ++ Increase Increase :: operator ++ ( int ) ( int ) { Increase temp; temp.value = ++ ; ++ ; return { Increase temp; temp.value = value valuereturn temp; } temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n n ++ ; ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-4 class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; Increase operator ++ ( ) ; // 前置 Increase operator ++ ( int ) ; // 后置 private: unsigned value ; }; Increase Increase :: operator ++ ( ) { value ++ ; return *this ; } Increase Increase :: operator ++ ( int ) { Increase temp; temp.value = value ++ ; return temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

成员函数重载++

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-5 class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; friend Increase operator ++ ( Increase & ) ; // 前置 friend Increase operator ++ ( Increase &, int ) ; // 后置 private: unsigned value ; }; Increase operator ++ ( Increase & a ) { a.value ++ ; return a ; } Increase operator ++ ( Increase & a, int ) { Increase temp(a); a.value ++ ; return temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

友员函数重载++

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-5 友员函数重载++ class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; friend Increase operator ++ ( Increase & ) ; friend Increase operator ++ ( Increase & ) ; // 前置 friend Increase operator ++ ( Increase &, int ) ; // 后置 private: unsigned value ; }; Increase operator Increase & a ) Increase operator ++ (++ ( Increase & a ) { a.value ++ ; ;return a ; } a ; } a.value ++ return Increase operator ++ ( Increase & a, int ) { Increase temp(a); a.value ++ ; return temp; } void main( ) 通过引用参数 { Increase a , b , n ; 操作对象 for ( int i = 0 ; i < 10 ; i ++ ) a = n ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; ; ++ n cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-5 友员函数重载++ class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; friend Increase operator ++ ( Increase & ) ; // 前置 friend Increase operator ++ ( Increase ; friendIncrease operator ++ ( Increase &, int ) &, int// 后置 ); private: unsigned value ; }; 复制构造 Increase operator ++ ( Increase & a ) 局部对象 { a.value ++ ; return a ; } Increase operator ++ ( Increase ) Increase operator ++ ( Increase & a, int& a, int ) Increase temp(a); a.value ++ ; return {{Increase temp(a); a.value ++ ; return temp; } temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n n ++ ; ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-5 class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; friend Increase operator ++ ( Increase & ) ; // 前置 friend Increase operator ++ ( Increase ; friendIncrease operator ++ ( Increase &, int ) &, int// 后置 ); private: unsigned value ; }; Increase operator ++ ( Increase & a ) { a.value ++ ; return a ; } Increase operator ++ ( Increase ) Increase operator ++ ( Increase & a, int& a, int ) Increase temp(a); a.value ++ ; return {{Increase temp(a); a.value ++ ; return temp; } temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n n ++ ; ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

友员函数重载++

伪参数

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-5 class Increase { public : Increase ( ) { value=0; } void display( ) const { cout<<value<<'\n'; } ; friend Increase operator ++ ( Increase & ) ; // 前置 friend Increase operator ++ ( Increase &, int ) ; // 后置 private: unsigned value ; }; Increase operator ++ ( Increase & a ) { a.value ++ ; return a ; } Increase operator ++ ( Increase & a, int ) { Increase temp(a); a.value ++ ; return temp; } void main( ) { Increase a , b , n ; for ( int i = 0 ; i < 10 ; i ++ ) a = n ++ ; cout <<"n= " ; n.display( ) ; cout <<"a= " ; a.display( ) ; for ( i = 0 ; i < 10 ; i ++ ) b = ++ n ; cout << "n= " ; n.display( ) ; cout << "b= " ; b.display( ) ; }
6.3.1 重载++与--

友员函数重载++

华南理工大学计算机学院 周霭如 2004

6.3.2 重载赋值运算符

6.3.2 重载赋值运算符

? 赋值运算符重载用于对象数据的复制 ? operator= 必须重载为成员函数 ?重载函数原型为:

类型 & 类名 :: operator= ( const 类名 & ) ;

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 ~ Name() ; protected : char *pName ; int size ; };
6.3.2 重载赋值运算符

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 ~ Name() ; protected : char *pName ; 初始化对象时 int size ; 调用复制构造函数 };
6.3.2 重载赋值运算符

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 ~ Name() ; protected : char *pName ; int size ; 修改对象时 };
6.3.2 重载赋值运算符

调用重载赋值运算符函数

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

6.3.2 重载赋值运算符

Obj Name::Name ( char *pN ) this 6-6 定义Name类的重载赋值函数 例 { cout <<" Constructing " << pN << endl ; L C pName = new char[ strlen( pN ) + 1 ] ; i h if( pName != 0 ) strcpy( pName,pN ) ; e H n size = strlen( pN ) ; a g } i Name::Name( const Name & Obj ) //复制构造函数 M { cout << " Copying " << Obj.pName << " into its own block\n"; i pName = new char[strlen( Obj.pName ) + this->size 1]; Obj.size n if ( pName != 0 ) strcpy( pName, Obj.pName ) ; g 10 6 size = Obj.size; } Name && Name::operator= ( const Name & Obj ) // 重载赋值算符 Name Name::operator= ( const Name & Obj ) { delete []pName ; {pName =[]pName ;strlen( Obj.pName ) + 1 ] ; delete new char[ ifpName =!= 0 ) strcpy(strlen( Obj.pName ))+ 1 ] ; ( pName new char[ pName , Obj.pName ; size = Obj.size ; if ( pName != 0 ) strcpy( pName , Obj.pName ) ; return *this ; } size = Obj.size ; Name::~ Name() return *this ; { cout << " Destructing " << pName << endl ; }pName[0] = '\0' ; delete []pName ; size = 0; } 华南理工大学计算机学院 周霭如 2004

Obj Name::Name ( char *pN ) this 6-6 定义Name类的重载赋值函数 例 { cout <<" Constructing " << pN << endl ; L C pName = new char[ strlen( pN ) + 1 ] ; i h if( pName != 0 ) strcpy( pName,pN ) ; e H n size = strlen( pN ) ; a g } i Name::Name( const Name & Obj ) //复制构造函数 M { cout << " Copying " << Obj.pName << " into its own block\n"; i pName = new char[strlen( Obj.pName ) + this->size 1]; Obj.size n if ( pName != 0 ) strcpy( pName, Obj.pName ) ; g 10 6 size = Obj.size; } Name && Name::operator= ( const Name & Obj ) // 重载赋值算符 Name Name::operator= ( const Name & Obj ) { delete []pName ; {pName = []pName strlen( Obj.pName ) + 1 ] ; delete new char[ ; ifpName =!= 0 ) strcpy(strlen( Obj.pName ))+ 1 ] ; ( pName new char[ pName , Obj.pName ; size = Obj.size ; if ( pName != 0 ) strcpy( pName , Obj.pName ) ; return *this ; } size = Obj.size ; Name::~ Name() return *this ; { cout << " Destructing " << pName << endl ; }pName[0] = '\0' ; delete []pName ; size = 0; } 华南理工大学计算机学院 周霭如 2004
6.3.2 重载赋值运算符

Obj Name::Name ( char *pN ) this 6-6 定义Name类的重载赋值函数 例 { cout <<" Constructing " << pN << endl ; L pName = new char[ strlen( pN ) + 1 ] ; i if( pName != 0 ) strcpy( pName,pN ) ; H size = strlen( pN ) ; a } i Name::Name( const Name & Obj ) //复制构造函数 { cout << " Copying " << Obj.pName << " into its own block\n"; pName = new char[strlen( Obj.pName ) + this->size 1]; Obj.size if ( pName != 0 ) strcpy( pName, Obj.pName ) ; 10 6 size = Obj.size; } Name && Name::operator= ( const Name & Obj ) // 重载赋值算符 Name Name::operator= ( const Name & Obj ) { delete []pName ; {pName =[]pName ;strlen( Obj.pName ) + 1 ] ; delete new char[ ifpName = newstrcpy( pName , Obj.pName ;) + 1 ] ; ( pName != 0 ) char[ strlen( Obj.pName ) size = Obj.size ; if ( pName != 0 ) strcpy( pName , Obj.pName ) ; return *this ; } size = Obj.size ; Name::~ Name() return *this ; { cout << " Destructing " << pName << endl ; }pName[0] = '\0' ; delete []pName ; size = 0; } 华南理工大学计算机学院 周霭如 2004
6.3.2 重载赋值运算符

Obj Name::Name ( char *pN ) this 6-6 定义Name类的重载赋值函数 例 { cout <<" Constructing " << pN << endl ; L L pName = new char[ strlen( pN ) + 1 ] ; i i if( pName != 0 ) strcpy( pName,pN ) ; H H size = strlen( pN ) ; a a } i Name::Name( const Name & Obj ) //复制构造函数 i { cout << " Copying " << Obj.pName << " into its own block\n"; pName = new char[strlen( Obj.pName ) + this->size 1]; Obj.size if ( pName != 0 ) strcpy( pName, Obj.pName ) ; 10 6 size = Obj.size; } Name && Name::operator= ( const Name & Obj ) // 重载赋值算符 Name Name::operator= ( const Name & Obj ) { delete []pName ; {pName =[]pName ;strlen( Obj.pName ) + 1 ] ; delete new char[ ifpName =!= 0 ) strcpy(strlen( Obj.pName ))+ 1 ] ; ( pName new char[ pName , Obj.pName ; size = Obj.size ; if ( pName != 0 ) strcpy( pName , Obj.pName ) ; return *this ; } size = Obj.size ; Name::~ Name() return *this ; { cout << " Destructing " << pName << endl ; }pName[0] = '\0' ; delete []pName ; size = 0; } 华南理工大学计算机学院 周霭如 2004
6.3.2 重载赋值运算符

Obj Name::Name ( char *pN ) this 6-6 定义Name类的重载赋值函数 例 { cout <<" Constructing " << pN << endl ; L L pName = new char[ strlen( pN ) + 1 ] ; i i if( pName != 0 ) strcpy( pName,pN ) ; H H size = strlen( pN ) ; a a } i Name::Name( const Name & Obj ) //复制构造函数 i { cout << " Copying " << Obj.pName << " into its own block\n"; pName = new char[strlen( Obj.pName ) + this->size 1]; Obj.size if ( pName != 0 ) strcpy( pName, Obj.pName ) ; 10 6 6 size = Obj.size; } Name && Name::operator= ( const Name & Obj ) // 重载赋值算符 Name Name::operator= ( const Name & Obj ) { delete []pName ; {pName =[]pName ;strlen( Obj.pName ) + 1 ] ; delete new char[ ifpName =!= 0 ) strcpy(strlen( Obj.pName ))+ 1 ] ; ( pName new char[ pName , Obj.pName ; size = Obj.size ; if ( pName != 0 ) strcpy( pName , Obj.pName ) ; return *this ; } size = Obj.size ; Name::~ Name() return *this ; { cout << " Destructing " << pName << endl ; }pName[0] = '\0' ; delete []pName ; size = 0; } 华南理工大学计算机学院 周霭如 2004
6.3.2 重载赋值运算符

Obj Name::Name ( char *pN ) this 6-6 定义Name类的重载赋值函数 例 { cout <<" Constructing " << pN << endl ; L L pName = new char[ strlen( pN ) + 1 ] ; i i if( pName != 0 ) strcpy( pName,pN ) ; H H size = strlen( pN ) ; a a } i Name::Name( const Name & Obj ) //复制构造函数 i { cout << " Copying " << Obj.pName << " into its own block\n"; pName = new char[strlen( Obj.pName ) + this->size 1]; Obj.size if ( pName != 0 ) strcpy( pName, Obj.pName ) ; 6 6 size = Obj.size; } Name && Name::operator= ( const Name & Obj ) // 重载赋值算符 Name Name::operator= ( const Name & Obj ) { delete []pName ; {pName =[]pName ;strlen( Obj.pName ) + 1 ] ; delete new char[ ifpName =!= 0 ) strcpy(strlen( Obj.pName ))+ 1 ] ; ( pName new char[ pName , Obj.pName ; size = Obj.size ; if ( pName != 0 ) strcpy( pName , Obj.pName ) ; return *this ; } size = Obj.size ; Name::~ Name() return *this ; { cout << " Destructing " << pName << endl ; }pName[0] = '\0' ; delete []pName ; size = 0; } 华南理工大学计算机学院 周霭如 2004
6.3.2 重载赋值运算符

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 ~ Name() ; protected : char *pName ; int size ; };
6.3.2 重载赋值运算符

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 构造对象 ~ Name() ; protected : char *pName ; int size ; };
6.3.2 重载赋值运算符

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 ~ Name() ; 复制构造对象 protected : char *pName ; int size ; };
6.3.2 重载赋值运算符

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 ~ Name() ; protected : 构造对象 char *pName ; int size ; };
6.3.2 重载赋值运算符

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

#include<iostream.h> 例6-6 定义Name类的重载赋值函数 #include<string.h> class Name { public : Name ( char *pN ) ; Name( const Name & ) ; //复制构造函数 Name& operator=( const Name& ) ; // 重载赋值算符 ~ Name() ; protected : 析构赋值操作后 char *pName ; 的对象 int size ; };
6.3.2 重载赋值运算符

void main() { Name Obj1( "ZhangSan" ) ; Name Obj2 = Obj1 ; Name Obj3( "NoName" ) ; Obj3 = Obj2 = Obj1 ; }
华南理工大学计算机学院 周霭如 2004

// 调用复制构造函数 // 调用重载赋值算符函数

6.3.3

重载运算符[]和()

6.3.3 重载运算符[]和()

? 运算符 [] 和 () 是二元运算符

? [] 和 () 只能用成员函数重载,不能用友元函数重载

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

[] 运算符用于访问数据对象的元素 重载格式

类 :: 类型 operator[] ( 类型 ) ;

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

[] 运算符用于访问数据对象的元素 重载格式

类 :: 类型 operator[] ( 类型 ) ;

定义重载函数的类名

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

[] 运算符用于访问数据对象的元素

重载格式

类 :: 类型 operator[] [ 类型 ] ;

函数返回类型

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

[] 运算符用于访问数据对象的元素 重载格式

类 :: 类型 operator[] ( 类型 ) ;

函数名

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

[] 运算符用于访问数据对象的元素 重载格式

类 :: 类型 operator[] ( 类型 ) ;

右操作数 为符合原语义,用 int

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

[] 运算符用于访问数据对象的元素 重载格式

类 :: 类型 operator() [ 类型 ] ;
显式声明


设 x 是类 X 的一个对象,则表达式 x[y] 可被解释为 x . operator [ ] ( y )

一个参数

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

// 例6-7 #include<iostream.h> class vector { public : vector ( int n ) { v = new int [ n ] ; size = n ; } ~ vector ( ) { delete [ ] v ; size = 0 ; } int & operator [ ] ( int i ) { return v [ i ] ; } private : int * v ; int size ; }; void main ( ) { vector a ( 5 ) ; a [ 2 ] = 12 ; cout << a [ 2 ] << endl ; }
华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

// 例6-7 #include<iostream.h> class vector { public : vector ( int n ) { v = new int [ n ] ; size = n ; } ~ vector ( ) { delete [ ] v ; size = 0 ; } int & operator [ ] ( int i ) { return v [ i ] ; } private : int * v ; int size ; }; void main ( ) { vector a ( 5 ) ; 返回元素的引用 a [ 2 ] = 12 ; this -> v[i] cout << a [ 2 ] << endl ; }

华南理工大学计算机学院 周霭如 2004

1.重载下标算符 []
6.3.3 重载运算符[]和()

// 例6-7 #include<iostream.h> class vector { public : vector ( int n ) { v = new int [ n ] ; size = n ; } ~ vector ( ) { delete [ ] v ; size = 0 ; } int & operator [ ] ( int i ) { return v [ i ] ; } private : int * v ; int size ; }; void main ( ) v [ i ] 是局部量吗? { vector a ( 5 ) ; a [ 2 ] = 12 ; cout << a [ 2 ] << endl ; }

华南理工大学计算机学院 周霭如 2004

2.重载函数调用符 ()
6.3.3 重载运算符[]和()

() 运算符用于函数调用 重载格式

类 :: 类型 operator() ( 表达式表 ) ;


设 x 是类 X 的一个对象,则表达式 x ( arg1, arg2 ) 可被解释为 x . operator () (arg1, arg2 )

华南理工大学计算机学院 周霭如 2004

2.重载函数调用符 ()
6.3.3 重载运算符[]和()

//例6-8 用重载()算符实现数学函数的抽象
#include <iostream.h> class F

{ public :
double operator ( ) ( double x , double y ) ; }; double F :: operator ( ) ( double x , double y ) { return x * x + y * y ; } void main ( ) {F f ; cout << f ( 5.2 , 2.5 ) << endl ; }
华南理工大学计算机学院 周霭如 2004

2.重载函数调用符 ()
6.3.3 重载运算符[]和()

//例6-8 用重载()算符实现数学函数的抽象
#include <iostream.h> class F

{ public :
f . operator() (5.2, 2.5) double operator ( ) ( double x , double y ) ; }; double F :: operator ( ) ( double x , double y ) { return x * x + y * y ; } void main ( ) {F f ; cout << f ( 5.2 , 2.5 ) << endl ; }
华南理工大学计算机学院 周霭如 2004

2.重载函数调用符 ()
6.3.3 重载运算符[]和()

//例6-8 用重载()算符实现数学函数的抽象
#include <iostream.h> class F

{ public :
double operator ( ) ( double x , double y ) ; memFun }; double F :: operator ( ) ( double x , double y ) memFun { return x * x + y * y ; } void main ( ) {F f ; cout << ff.memFun)(5.2,2.5) ; ( 5.2 , 2.5 << endl }
华南理工大学计算机学院 周霭如 2004

比较 定义普通成员函数

6.3.4

重载流插入和流提取运算符
6.3.4 重载流插入和流提取运算符

? ? ? ? ?

istream 和 ostream 是 C++ 的预定义流类 cin 是 istream 的对象,cout 是 ostream 的对象 运算符 << 由ostream 重载为插入操作,用于输出基本类型数据 运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据 程序员重载 << 和 >> ,用于输出和输入用户自定义的数据类型

华南理工大学计算机学院 周霭如 2004

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-9 为vector类重载流插入运算符和 #include<stdlib.h> 提取运算符 class vector { public : vector( int size =1 ) ; ~vector() ; int & operator[] ( int i ) ; friend ostream & operator << ( ostream & output , vector & ) ; friend istream & operator >> ( istream & input, vector & ) ; private : int * v ; int len ; }; void main() { int k ; cout << "Input the length of vector A :\n" ; cin >> k ; vector A( k ) ; cout << "Input the elements of vector A :\n" ; cin >> A ; cout << "Output the elements of vector A :\n" ; cout << A ; }
6.3.4 重载流插入和流提取运算符

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-9 为vector类重载流插入运算符和 #include<stdlib.h> 提取运算符 class vector 重载几个运算符 { public : vector( int size =1 ) ; ~vector() ; int & operator[] ( int i ) ; friend ostream & operator << ( ostream & output , vector & ) ; friend istream & operator >> ( istream & input, vector & ) ; private : int * v ; int len ; }; void main() { int k ; cout << "Input the length of vector A :\n" ; cin >> k ; vector A( k ) ; cout << "Input the elements of vector A :\n" ; cin >> A ; cout << "Output the elements of vector A :\n" ; cout << A ; }
6.3.4 重载流插入和流提取运算符

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-9 为vector类重载流插入运算符和 #include<stdlib.h> 提取运算符 class vector { public : 标准流类 vector( int size =1 ) ; ~vector() ; int & operator[] ( int i ) ; friend ostream & operator << ( ostream & output , vector & ) ; friend istream & operator >> ( istream & input, vector & ) ; private : int * v ; int len ; }; void main() { int k ; cout << "Input the length of vector A :\n" ; cin >> k ; vector A( k ) ; cout << "Input the elements of vector A :\n" ; cin >> A ; cout << "Output the elements of vector A :\n" ; cout << A ; }
6.3.4 重载流插入和流提取运算符

#include<iostream.h> 例6-9 为vector类重载流插入运算符和 #include<stdlib.h> 提取运算符 class vector { public : vector( int size =1 ) ; ~vector() ; int & operator[] ( int i ) ; friend ostream & operator << ( ostream & output , vector & ) ; friend istream & operator >> ( istream & input, vector & ) ; 使用预定义版本 private :
6.3.4 重载流插入和流提取运算符

int * v ;

int len ;

华南理工大学计算机学院 周霭如 2004

}; void main() { int k ; cout << "Input the length of vector A :\n" ; cin >> k ; vector A( k ) ; cout << "Input the elements of vector A :\n" ; cin >> A ; cout << "Output the elements of vector A :\n" ; cout << A ; }

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-9 为vector类重载流插入运算符和 #include<stdlib.h> 提取运算符 class vector { public : vector( int size =1 ) ; ~vector() ; int & operator[] ( int i ) ; friend ostream & operator << ( ostream & output , vector & ) ; friend istream & operator >> ( istream & input, vector & ) ; private : int * v ; int len ; }; 使用重载版本 void main() . operator >> (A) cin { int k ; cout << "Input the length of vector A :\n" ; cin >> k ; vector A( k ) ; cout << "Input the elements of vector A :\n" ; cin >> A ; cout << "Output the elements of vector A :\n" ; cout << A ; }
6.3.4 重载流插入和流提取运算符

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> 例6-9 为vector类重载流插入运算符和 #include<stdlib.h> 提取运算符 class vector { public : vector( int size =1 ) ; ~vector() ; int & operator[] ( int i ) ; friend ostream & operator << ( ostream & output , vector & ) ; friend istream & operator >> ( istream & input, vector & ) ; private : int * v ; int len ; }; 使用重载版本 void main() cout . operator << (A) { int k ; cout << "Input the length of vector A :\n" ; cin >> k ; vector A( k ) ; cout << "Input the elements of vector A :\n" ; cin >> A ; cout << "Output the elements of vector A :\n" ; cout << A ; }
6.3.4 重载流插入和流提取运算符

vector::vector( int size ) 例6-9 为vector类重载流插入运算符和 { if (size <= 0 || size > 100 ) 提取运算符 { cout << "The size of " << size << " is null !\n" ; abort() ; } v = new int[ size ] ; len = size ; } vector :: ~vector() { delete[] v ; len = 0 ; } int & vector :: operator [] ( int i ) { if( i >=0 && i < len ) return v[ i ] ; cout << "The subscript " << i << " is outside !\n" ; abort() ; } ostream & operator << ( ostream & output, vector & ary ) { for(int i = 0 ; i < ary.len ; i ++ ) output << ary[ i ] << " " ; output << endl ; return output ; } istream & operator >> ( istream & input, vector & ary ) { for( int i = 0 ; i < ary.len ; i ++ ) input >> ary[ i ] ; return input ; } 华南理工大学计算机学院 周霭如 2004
6.3.4 重载流插入和流提取运算符

vector::vector( int size ) 例6-9 为vector类重载流插入运算符和 { if (size <= 0 || size > 100 ) 提取运算符 { cout << "The size of " << size << " is null !\n" ; abort() ; } v = new int[ size ] ; len = size ; } vector :: ~vector() { delete[] v ; len = 0 ; } int & vector :: operator [] ( int i ) { if( i >=0 && i < len ) return v[ i ] ; 使用重载版本 cout << "The subscript " << i << " is outside !\n" ; abort() ; } 访问对象元素 ostream & operator << ( ostream & output, vector & ary ) { for(int i = 0 ; i < ary.len ; i ++ ) output << ary[ i ] << " " ; output << endl ; return output ; } istream & operator >> ( istream & input, vector & ary ) { for( int i = 0 ; i < ary.len ; i ++ ) input >> ary[ i ] ; return input ; } 华南理工大学计算机学院 周霭如 2004
6.3.4 重载流插入和流提取运算符

vector::vector( int size ) 例6-9 为vector类重载流插入运算符和 { if (size <= 0 || size > 100 ) 提取运算符 { cout << "The size of " << size << " is null !\n" ; abort() ; } v = new int[ size ] ; len = size ; } vector :: ~vector() { delete[] v ; len = 0 ; } int & vector :: operator [] ( int i ) cout 的别名 { if( i >=0 && i < len ) return v[ i ] ;
6.3.4 重载流插入和流提取运算符

cout << "The subscript " << i << " is outside !\n" ; abort() ; } ostream & operator << ( ostream & output, vector & ary ) { for(int i = 0 ; i < ary.len ; i ++ ) output << ary[ i ] << " " ; output << endl ; return output ; } istream & operator >> ( istream & input, vector & ary ) { for( int i = 0 ; i < ary.len ; i ++ ) input >> ary[ i ] ; return input ; } 华南理工大学计算机学院 周霭如 2004

vector::vector( int size ) 例6-9 为vector类重载流插入运算符和 { if (size <= 0 || size > 100 ) 提取运算符 { cout << "The size of " << size << " is null !\n" ; abort() ; } v = new int[ size ] ; len = size ; } vector :: ~vector() { delete[] v ; len = 0 ; } int & vector :: operator [] ( int i ) { if( i >=0 && i < len ) return v[ i ] ; cout << "The subscript " << i << " is outside !\n" ; abort() ; } ostream & operator << ( ostream & output, vector & ary ) { for(int i = 0 ; i < ary.len ; i ++ ) output << ary[ i ] << " " ; cin 的别名 output << endl ; return output ; } istream & operator >> ( istream & input, vector & ary ) { for( int i = 0 ; i < ary.len ; i ++ ) input >> ary[ i ] ; return input ; } 华南理工大学计算机学院 周霭如 2004
6.3.4 重载流插入和流提取运算符

vector::vector( int size ) 例6-9 为vector类重载流插入运算符和 { if (size <= 0 || size > 100 ) 提取运算符 { cout << "The size of " << size << " is null !\n" ; abort() ; } v = new int[ size ] ; len = size ; } 返回流类引用 vector :: ~vector() { delete[] v ; len = 0 ; } 以符合原语义 int & vector :: operator [] ( int i ) { if( i >=0 && i < len ) return v[ i ] ; cout << "The subscript " << i << " is outside !\n" ; abort() ; } ostream & operator << ( ostream & output, vector & ary ) { for(int i = 0 ; i < ary.len ; i ++ ) output << ary[ i ] << " " ; output << endl ; return output ; } istream & operator >> ( istream & input, vector & ary ) { for( int i = 0 ; i < ary.len ; i ++ ) input >> ary[ i ] ; return input ; } 华南理工大学计算机学院 周霭如 2004
6.3.4 重载流插入和流提取运算符

vector::vector( int size ) 例6-9 为vector类重载流插入运算符和 { if (size <= 0 || size > 100 ) 提取运算符 { cout << "The size of " << size << " is null !\n" ; abort() ; } v = new int[ size ] ; len = size ; } vector :: ~vector() { delete[] v ; len = 0 ; } int & vector :: operator [] ( int i ) { if( i >=0 && i < len ) return v[ i ] ; cout << "The subscript " << i << " is outside !\n" ; abort() ; } ostream & operator << ( ostream & output, vector & ary ) { for(int i = 0 ; i < ary.len ; i ++ ) output << ary[ i ] << " " ; output << endl ; return output ; } istream & operator >> ( istream & input, vector & ary ) { for( int i = 0 ; i < ary.len ; i ++ ) input >> ary[ i ] ; return input ; } 华南理工大学计算机学院 周霭如 2004
6.3.4 重载流插入和流提取运算符

6.4

类类型转换
6.4 类类型转换

?

数据类型转换在程序编译时或在程序运行实现 基本类型 ←→ 基本类型 基本类型 ←→ 类类型 类类型 ←→ 类类型

?

类对象的类型转换可由两种方式说明: 构造函数 转换函数

称为用户定义的类型转换或类类型转换,有隐式调用和显式调用方式

华南理工大学计算机学院 周霭如 2004

6.4.1

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

? 当类 ClassX 具有以下形式的构造函数: ClassX :: ClassX ( arg ,arg1 = E1 ,…, argn = En ) ; 说明了一种从参数 arg 的类型到该类类型的转换

华南理工大学计算机学院 周霭如 2004

6.4.1
例如

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

class X { // …… public : X ( int ) ;

X ( const char * , int = 0 ) ;
}; void f ( X arg ) ; :

X a = X( 1 ) ;
X b = "Jessie" ; a=2; f(3); f ( 10 , 20 ) ;
华南理工大学计算机学院 周霭如 2004

// a = 1
// b = X ( "Jessie" , 0 ) // a = X ( 2 ) // f ( X ( 3 ) ) // error

6.4.1
例如

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

class X { // …… public : X ( int ) ;

调用构造函数 X ( int )
把 1 转换为类类型 X 后赋给对象 a 也称 X ( 1 ) 为 X 类的类型常量

X ( const char * , int = 0 ) ;
}; void f ( X arg ) ; :

X a = X( 1 ) ;
X b = "Jessie" ; a=2; f(3); f ( 10 , 20 ) ;
华南理工大学计算机学院 周霭如 2004

// a = 1
// b = X ( "Jessie" , 0 ) // a = X ( 2 ) // f ( X ( 3 ) ) // error

6.4.1
例如

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

class X { // …… public : X ( int ) ;

调用构造函数X ( const char * , int = 0 ) 把字符串转换为类类型 X 后赋给对象 b

X ( const char * , int = 0 ) ;
}; void f ( X arg ) ; :

X a = X( 1 ) ;
X b = "Jessie" ; a=2; f(3); f ( 10 , 20 ) ;
华南理工大学计算机学院 周霭如 2004

// a = 1
// b = X ( "Jessie" , 0 ) // a = X ( 2 ) // f ( X ( 3 ) ) // error

6.4.1
例如

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

class X { // …… public : X ( int ) ; 隐式调用构造函数 X ( int ) 把 2 转换为类类型 X 后赋给对象

X ( const char * , int = 0 ) ;
}; void f ( X arg ) ; :

X a = X( 1 ) ;
X b = "Jessie" ; a=2; f(3); f ( 10 , 20 ) ;
华南理工大学计算机学院 周霭如 2004

// a = 1
// b = X ( "Jessie" , 0 ) // a = X ( 2 ) // f ( X ( 3 ) ) // error

6.4.1
例如

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

class X { // …… public : X ( int ) ; }; void f ( X arg ) ; : 隐式调用构造函数 X ( int ) 对实参作类类型转换,然后做参数结合

X ( const char * , int = 0 ) ;

X a = X( 1 ) ;
X b = "Jessie" ; a=2; f(3); f ( 10 , 20 ) ;
华南理工大学计算机学院 周霭如 2004

// a = 1
// b = X ( "Jessie" , 0 ) // a = X ( 2 ) // f ( X ( 3 ) ) // error

6.4.1
例如

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

class X { // …… public : X ( int ) ;

X ( const char * , int = 0 ) ;
}; void f ( X arg ) ; :

当找不到匹配的构造函数时

转换失败
// a = 1
// b = X ( "Jessie" , 0 ) // a = X ( 2 ) // f ( X ( 3 ) ) // error

X a = X( 1 ) ;
X b = "Jessie" ; a=2; f(3); f ( 10 , 20 ) ;
华南理工大学计算机学院 周霭如 2004

6.4.1
例如

构造函数进行类类型转换
6.4.1 构造函数进行类类型转换

class X { // …… public : X ( int ) ;

这样的隐式类型转换 由系统自动完成

X ( const char * , int = 0 ) ;
}; void f ( X arg ) ; :

X a = X( 1 ) ;
X b = "Jessie" ; a=2; f(3); f ( 10 , 20 ) ;
华南理工大学计算机学院 周霭如 2004

// a = 1
// b = X ( "Jessie" , 0 ) // a = X ( 2 ) // f ( X ( 3 ) ) // error

6.4.2

类型转换函数
6.4.2 类类型转换函数

? 带参数的构造函数不能把一个类类型转换成基本类型 ? 类类型转换函数是一种特殊的成员函数,提供类对象之间 显式类型转换的机制

华南理工大学计算机学院 周霭如 2004

6.4.2

类型转换函数
6.4.2 类类型转换函数

语法形式:
X :: operator T ( ) { …… return T 类型的对象 } 功能:将类型 X 的对象转换为类型 T 的对象 ? T 可以是预定义类型,也可以是用户定义类型 ? 函数没有参数,没有返回类型,但必须有一条 return 语句,返回 T 类型的对象 ? 该函数只能为成员函数,不能为友员

华南理工大学计算机学院 周霭如 2004

6.4.2

类型转换函数
6.4.2 类类型转换函数

例如:
class X { …… public : operator int ( ) ; …… }; void f ( X a ) { int i = int ( a ) ; i = ( int ) a ; i=a; }
华南理工大学计算机学院 周霭如 2004

6.4.2

类型转换函数
6.4.2 类类型转换函数

例如:
class X { …… public : operator int ( ) ; …… }; void f ( X a ) { int i = int ( a ) ; i = ( int ) a ; i=a; }
华南理工大学计算机学院 周霭如 2004

使用三种 类型转换规则?

No
a 是一个类对象, 它们都用类型转换函数作类型转换

X :: operator int ()

6.4.2

类型转换函数
6.4.2 类类型转换函数

例如:
class X { …… public : operator int ( ) ; …… }; void f ( X a ) { int i = int ( a ) ; i = ( int ) a ; i=a; }
华南理工大学计算机学院 周霭如 2004

No
a 是一个类对象, 它们都用类型转换函数作类型转换

X :: operator int ()

6.4.2

类型转换函数
6.4.2 类类型转换函数

例如:
class X { …… public : operator int ( ) ; …… }; void f ( X a ) { int i = int ( a ) ; i = ( int ) a ; i=a; }
华南理工大学计算机学院 周霭如 2004

除了赋值和初始化, 类型转换函数还可以这样使用:

void g ( X a , X b ) { int i = ( a ) ? 1 + a : 0 ;

int j = ( a && b ) ? a + b : i ;
if ( a ) { …… } ; } 对象 a 、b 可用在整型变量出现的地方

6.4.2

类型转换函数
6.4.2 类类型转换函数

? 类型转换函数有两种使用方式:
隐式使用 显式使用 i=a; i = a . operator int ( ) // int ( a ) ( int ) a

? 使用不同函数作类型转换函数:

int i = a ;
X i=a;

// 用类型转换函数进行转换
// 用构造函数进行转换

华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class Rational
6.4.2 类类型转换函数

例6-10 有理数计算
// 构造函数,把长整型转换成Rational类型

{ public : Rational (long n , long d=1) ; friend Rational operator+ ( const Rational & ,const Rational & ) ; friend ostream & operator<< ( ostream & , const Rational & ) ; operator double() ; // 类型转换函数 private : long Numerator , Denominator ;

};
void main ( ) { Rational a( 2, 4 ), b = (1, 2), c( 0 ) ; c = a + b; // 使用友员重载 “+” 和 缺省重载 “=”

cout << a << " + "<< b << " = "<< c << endl;
// 以实数形式显示,调用类型转换函数:

// 以分数形式显示

cout << double( a ) << " + " << double( b ) << " = " << double( c ) << endl ; c = b + Rational( 1 ) ; cout << b << " + " << 1 << " = " << c << endl ; cout << double( b ) << " + " << 1 << " = " << double( c ) << endl ; }
华南理工大学计算机学院 周霭如 2004

// 调用构造函数作类型转换

#include<iostream.h> class Rational
6.4.2 类类型转换函数

例6-10 有理数计算

{ public :

Rational (long n , long d=1) ; // 构造函数,把长整型转换成Rational类型
friend Rational operator+ ( const Rational & ,const Rational & ) ; friend ostream & operator<< ( ostream & , const Rational & ) ; operator double() ; // 类型转换函数 private : long Numerator , Denominator ;

};
void main ( ) { Rational a( 2, 4 ), b = (1, 2), c( 0 ) ; c = a + b; // 使用友员重载 “+” 和 缺省重载 “=”

构造函数做类型转换

cout << a << " + "<< b << " = "<< c << endl;
// 以实数形式显示,调用类型转换函数:

// 以分数形式显示

cout << double( a ) << " + " << double( b ) << " = " << double( c ) << endl ; c = b + Rational( 1 ) ; // 调用构造函数作类型转换

cout << b << " + " << 1 << " = " << c << endl ;
cout << double( b ) << " + " << 1 << " = " << double( c ) << endl ; }
华南理工大学计算机学院 周霭如 2004

#include<iostream.h> class Rational
6.4.2 类类型转换函数

例6-10 有理数计算
// 构造函数,把长整型转换成Rational类型

{ public : Rational (long n , long d=1) ; friend Rational operator+ ( const Rational & ,const Rational & ) ; friend ostream & operator<< ( ostream & , const Rational & ) ;

operator double() ;
};
void main ( )

// 类型转换函数

private : long Numerator , Denominator ;

{ Rational a( 2, 4 ), b = (1, 2), c( 0 ) ; c = a + b;

类型转换函数做类型转换 // 使用友员重载 “+” 和 缺省重载 “=”
// 以分数形式显示

cout << a << " + "<< b << " = "<< c << endl;
// 以实数形式显示,调用类型转换函数:

cout << double( a ) << " + " << double( b ) << " = " << double( c ) << endl ; c = b + Rational( 1 ) ; // 调用构造函数作类型转换

cout << b << " + " << 1 << " = " << c << endl ;
cout << double( b ) << " + " << 1 << " = " << double( c ) << endl ; }
华南理工大学计算机学院 周霭如 2004

// 把长整型转换成Rational类型
6.4.2 类类型转换函数

例6-10 有理数计算

Rational :: Rational(long n, long d) { Numerator = n ; Denominator = d ; } // 把 Rational 类型转换成 double 类型

Rational :: operator double ()
{ return double( Numerator ) / double( Denominator ); } Rational operator+ ( const Rational & r1, const Rational & r2 ) { long n , d ; n = r1.Numerator * r2.Denominator + r1.Denominator * r2.Numerator ; d = r1.Denominator * r2.Denominator ; return Rational( n, d ) ; } ostream & operator << ( ostream & output, const Rational & x ) { output << x.Numerator << "/" << x.Denominator ; return output; }

华南理工大学计算机学院 周霭如 2004

小结
? 运算符重载可以像基本数据类型一样,用简洁明确的运算符操作自定义的 类对象。 ? ? ? 重载运算符函数可以对运算符作出新的解释,但重原有的基本语义不变。 运算符函数既可以重载为成员函数,也可以重载义为友员函数或普通函数。 当一元运算符的操作数,或者二元运算符的左操作数是该类的一个对象时, 以成员函数重载;当一个运算符的操作需要修改类对象状态时,应该以成 员函数重载。如果以成友员函数重载,可以使用引用参数修改对象。 ? 当运算符的操作数(尤其是第一个操作数)希望有隐式转换,则重载算符 时必须用友员函数。 ? 构造函数和类型转换函数可以实现基本类型与类类型,以及类类型之间的 类型转换。
华南理工大学计算机学院 周霭如 2004


相关文章:
c++运算符的重载习题答案
c++运算符重载习题答案_工学_高等教育_教育专区。c++ 习题答案 ...6,2,}; int b[10]={-11,8,10,17,-6,9,6,7,12,5}; Vector v1(...
C++程序设计运算符重载习题
C++程序设计运算符重载习题_工学_高等教育_教育专区。选择题 1.在下列运算符中...(a) = (b) = = (c) += (d) != 6.下面描述中,错误的是( )。 (...
C++运算符重载
C++运算符重载_数学_自然科学_专业资料。一、 运算符重载的规则 运算符重载规则...6. 运算符重载时必须遵循哪些原则: 运算符重载可以使程序更加简洁,使表达式更加...
C++之运算符重载(1)
比如高中数学里所 提到的复数: 1 2 3 4 5 6 7 8 9 10 11 class ...C++就为运算符重载提供 了一种方法,即运算符重载函数。其函数名字规定为 ...
清华大学Overload_Operator-C++运算符重载讲义
清华大学Overload_Operator-C++运算符重载讲义_计算机软件及应用_IT/计算机_专业...(); c2=c1+6.5; cout<<"c2=c1+18.5="; c2.display(); c3=6.5+...
c++操作符重载
c++6操作符重载 46页 2财富值如要投诉违规内容,请到百度文库投诉中心;如要提出...注意 CString afxStr3 = afxstr2 中的“=”赋值运算符将隐式创建对 象,...
c++运算符重载习题
c++运算符重载习题_从业资格考试_资格考试/认证_教育专区。Task8-1 /* 1. ...类中可以完成分数的加减乘除 (运算后再化简) 、求反、比较(6 种关系)的运算...
10.7C++重载流插入运算符和流提取运算符
10.7C++重载流插入运算符和流提取运算符_电脑基础知识_IT/计算机_专业资料。...4 10↙ c1=(3+6i) c2=(4+10i) 以上 运行结果无疑是正确的,但并不...
C++实验21 运算符重载
C++实验21 运算符重载_数学_自然科学_专业资料。实验 21 运算符重载一、实验目的...6. 用友元函数实现后置”--”运算符重载的一般格式为: ___。 ? 分析 1....
C++重载习题
C++重载习题_互联网_IT/计算机_专业资料。01.分析以下程序执行结果 #include<...解: Point 类提供了 6 个运算符重载函数(参加程序中的代码和注释),以实现...
更多相关标签: