1 c++的4个主要特点: 抽象, 封装, 继承和多态; 抽象, 封装是基础, 继承是关键, 多态是补充;
2 多态是指不同的对象面对不同的消息产生不同的行为;
3 函数重载和运算符重载都是简单一类多态性;
4 函数的重载: 给同一函数名予以不同的意义;
5 C++中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是成员函数,也可以是非成员函数;
6 定义这种重载函数时要求函数的参数的数量或类型至少有一处不同。而对于返回值的类型没有要求,可以相同,也可以不同,那种参数个数和类型都相同,仅仅返回值不同的重载函数是非法的;
7 重载函数的意义在于它可以用相同的名字访问一组相互关联的函数,由编译程序来进行选择,因而这将有助于解决程序复杂性问题;
8 运算符重载就是赋予已有的运算符多重含义, 本质是函数的重载, 是写一个函数解释某个运算符在某个类中的含义;
9 运算符重载后, 其原有的功能不会改变和消失;
10 运算符重载的方法: 函数类型 operator 运算符 ( 形参列表 );
11 运算符重载的规则:
1 不能自定义新的运算符,只能重载原有的运算符;
2 不能重载的运算符只有 5 个:
. ( 成员访问运算符 ) .* ( 成员指针访问运算符 ) // 为了保证访问成员的功能不被改变;
:: ( 域运算符 ) sizeof ( 长度运算符 ) // 运算对象是类型而不是变量不具备重载的特征
?: ( 条件运算符 )
3 不能改变运算符操作对象的个数 ( 单目运算符不能重载成双目运算符, 双目运算符不能重载成单目运算符 );
4 重载运算符的函数不能有默认值 ( 有可能改变运算符参数的个数, 与第三点矛盾 );
5 不能改变运算符的优先级;
6 不能改变运算符的结合性;
7 重载运算符必须和自定义的类对象一起用,其参数至少有一个是类对象或者引用;
8 运算符重载函数可以是成员函数也可以是友元函数;
12 使用重载运算符时应遵循如下原则:
1 重载运算符含义必须清楚;
2 重载运算符不能有二义性;
13 运算符重载函数的两种形式 : 成员函数形式和友元函数形式;这两种形式都可访问类中的私有成员;
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <cmath> using namespace std; class complex { public: complex() { real=imag=0; } complex(double r, double i){ real = r, imag = i; } // 成员函数 complex operator +(const complex &c)// 类内定义 { return complex(real + c.real, imag + c.imag); } complex operator -(const complex &c); //类外定义 // 友元函数 friend complex operator *(const complex &c, const complex &d ); // << 和 >> 只能重载成友元函数或者普通函数; friend ostream& operator << ( ostream&, complex & );// 重载 << friend istream& operator >> ( istream&, complex & );// 重载 >> private: double real, imag; }; inline complex complex::operator -(const complex &c) { return complex(real - c.real, imag - c.imag); } complex operator *(const complex &c, const complex &d ) { return complex(c.real * d.real - c.imag * d.imag, c.real * d.imag + c.imag * d.real); } ostream& operator << ( ostream &output, complex &c ) { if( c.imag>=0 ) output<< c.real<<"+"<<c.imag<<"i"<<endl; else output<< c.real<<"-"<<c.imag<<"i"<<endl; return output; } istream& operator >> ( istream &input, complex &c ) { cout<<" 请输入复数的实部和虚部"<<endl; input>>c.real>>c.imag; return input; } int main( ) { complex c1, c2, h, c, j; cin>>c1>>c2; h=c1+c2; c=c1-c2; j=c1*c2; cout << "c1="<<c1<< endl; cout << "c2="<<c2<< endl; cout << "c="<<c<< endl; cout << "h="<<h<< endl; cout <<"j="<<j<< endl; return 0; }