一、函数重载
C++允许在同一作用域中的某个函数和运算符指定多个定义,分 别称为函数重载和运算符重载
重载声明是指一个与之前已经在该作用域内声明过的函数或方法 具有相同名称的声明,但是它们的参数列表和实现不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。
C++中的函数重载
在同一个作用域内,可以声明几个功能类似的同名函数,但是这 些同名 函数的形式参数(指参数的个数、类型或者顺序)必须不同。 您不能仅通过返回类型的不同来重载函数。
下面的实例中,同名函数 print() 被用于输出不同的数据类型:
二、运算符重载
重载的运算符是带有特殊名称的函数,函数名是由关键字 oper ator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算 符有一个返回类型和一个参数列表。
Box operator + (const Box &);
声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。 大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成 员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要 为每次操作传递两个参数,如下所示:
Box operator+(const Box&, const Box&);
可重载运算符/不可重载运算符
例题:
用一个程序实现课程中讲过之外的三种运算符重载,其中new/delete为必选项,其他两个任选。
代码如下:
//new delete的重载 class A { int i; int j; public: A() { cout << "A()" << endl; } void *operator new(size_t size) { void *p; p = (void *)malloc(size); cout << "为对象申请字节空间为" << size << endl; return p; } void operator delete(void *p) { cout << "删除申请的字节空间" << endl; free(p); } void *operator new[](size_t size) { void *p; p = (void*)malloc(size); cout<< "为对象申请的内存单元个数" << size << endl; return p; } void operator delete[](void *p) { cout << "删除为申请的内存单元个数" << endl; free(p); } }; class B { public: double a; B(double x) { a = x; } double operator /(B m); }; double B::operator /(B m) { double x1; x1 = a / m.a; return x1; } //class C //{ //public: // string ss; // C(string s) // {ss = s;} // C &operator =(const C &); //private: // char *p1; //}; // //C &C::operator =(const C &m) //{ // if (this==&m) // { // return *this; //防止s=s的赋值 // } // char *p2; // p2 = new char[strlen(m.p1) + 1];//分配新区域 // strcpy(p2, m.p1); //字符串复制 // delete p1; // return *this; //} class D { public: double a; D(double x) { a = x; } double operator *(D m); }; double D::operator *(D m) { double x1; x1 = a * m.a; return x1; } int main() { cout << "************************" << endl; cout << "new delete的重载" << endl; A *a = new A; delete(a); A *a1 = new A[10]; delete[] a1; cout << "************************"<< endl; cout << "/的重载" << endl; B b1(2.6); B b2(3.6); double b3; b3 = b1 / b2; cout << "b3的值为" << b3 << endl; //cout << "************************" << endl; //cout << "=的重载" << endl; //C c1("边牛牛"); //C c2("真牛"); //c2 = c1; cout << "************************" << endl; cout << "*的重载" << endl; D d1(2.6); D d2(9.6); double d3; d3 = d1 * d2; cout << "d3的值为" << d3 << endl; return 0; }
结果为: