C++多态(二)——函数重载(overloading)和操作符重载

   任何函数都能重载。

一、普通函数的重载

C语言中一个函数只能处理一个类型的数据,不可能兼顾两种或多种数据类型;C++使用使用同一名称的函数来处理多个类型的数据。

#include <iostream>
#include <vector>
using namespace  std;

double sq(double y)     //fun1
{
    return y*y;
}

int sq(int y)           //fun2
{
    return y*y;
}

double sq(int y)        //fun3
{
    return (double)y*y;
}

void main()
{
    int i=5;
    double d=5.5;
    cout<<sq(i)<<endl;
    cout<<sq(d)<<endl;
}

其中的fun2和fun3冲突,因为两者的参数列表相同,不满足重载的条件。如果删掉fun3,得到答案25和30.25

所以,重载的依据是参数列表

二、构造函数的重载

#include <iostream>
using namespace std;

class A
{
    int a, b;
public:
    A( );
    A(int i, int j);
    ~A( );
    void Set(int i, int j)
    {a=i; b=j;}
};
A::A( )
{
    a=b=0;
    cout<<"No_arg_cons: a="<<a<<", b="<<b<<endl;
}
A::A(int i, int j)
{
    a=i;
    b=j;
    cout<<"Constructor: a="<<a<<", b="<<b<<endl;
}
A::~A( )
{
    cout<<"Destructor: a="<<a<<", b="<<b<<endl;
}
void main( )
{
    cout<<"Starting first round:\n";
    A     obja[3];
    for(int i=0; i<3; i++)
        obja[i].Set(i, i+1);
    cout<<"Finishing first round:\n";
    cout<<"Starting second round:\n";
    A     objb[3]={A(5,6),A(7,8),A(9,10)};
    cout<<"Finishing second round.\n";
    cout<<"Program being terminated!\n";
}

Result:Starting first round:
No_arg_cons: a=0, b=0
No_arg_cons: a=0, b=0
No_arg_cons: a=0, b=0
Finishing first round:
Starting second round:
Constructor: a=5, b=6
Constructor: a=7, b=8
Constructor: a=9, b=10
Finishing second round.
Program being terminated!
Destructor: a=9, b=10
Destructor: a=7, b=8
Destructor: a=5, b=6
Destructor: a=2, b=3
Destructor: a=1, b=2
Destructor: a=0, b=1

三、运算符重载

在面向对象程序设计语言中,运算符也是一种函数,所以运算符也能像函数一样给予重载,以便完成更多功能。

运算符重载有两种实现方式,一种作为友元函数,另一种是成员函数。

1.友元函数方式

#include <iostream>
using namespace std;

class point
{
    int x, y;
public:
    point (int vx=0, int vy=0)
    {
        x = vx;
        y = vy;
    }
    friend point operator + (point & p1, point & p2);
    friend point operator - (point & p1, point & p2);
    void print()
    {
        cout<<x<<" "<<y<<endl;
    }
};

point operator +(point & p1, point & p2)
{
    point p;
    p.x = p1.x + p2.x;
    p.y = p1.y + p2.y;
    return p;
}         //不能返回[局部变量的]引用
point operator -(point & p1, point & p2)
{
    point p;
    p.x = p1.x - p2.x;
    p.y = p1.y - p2.y;
    return p;
}
void main()
{
    point p1(10,10),p2(20,20);
    p1.print();
    p1 = p1 + p2;         //即p1= operator + (p1, p2)
    p1.print();
    p2 = p1 - p2;             //即p2= operator - (p1, p2)
    p2.print( );
}

2.成员函数方式

#include <iostream>
using namespace std;

class point
{
    int x, y;
public:
    point() { x = 0; y = 0; }
    point (int vx, int vy)
    { x = vx; y = vy; }
    point operator + (point & p);
    point operator - (point & p);
    void print() {cout<<x<<" "<<y<<endl; }
};
point point::operator +(point & p)
{
    point temp;
    temp.x = x + p.x;    //就是temp.x = this->x + p.x;两者相加
    temp.y = y + p.y;
    return temp;
}
point point::operator -(point & p)
{
    point temp;
    temp.x = x - p.x;
    temp.y = y - p.y;
    return temp;
}
void main()
{
    point  p1(10,10), p2(20,20), p3;
    p3.print();
    p3 = p1 + p2;        //即p3 = p1.operator + (p2);
    p3.print();
    p3 = p3 - p1;        //即p3 = p3.operator - (p1);
    p3.print();
}

 25

   30.25

时间: 2024-10-04 23:45:43

C++多态(二)——函数重载(overloading)和操作符重载的相关文章

HDU——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 148003    Accepted Submission(s): 35976 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

友元函数实现操作符重载的应用场景-友元函数实现左移右移操作符重载

先定义一个测试类Complex,其中用成员函数的方法重载了+.-.前置++.前置--.后置++.后置--这6个运算符,当然,这6个操作符也可以用友元函数方式重载,但习惯上这些都直接用成员函数方式重载. demo #include <iostream> using namespace std; class Complex { public: Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } ~Complex();

C++语言学习(八)——操作符重载

C++语言学习(八)--操作符重载 一.操作符重载基础 1.操作符重载的语法 通过operator关键字可以定义特殊的函数,operator本质是通过函数重载操作符. Type operator operatorname(const Type p1, const Type p2) { Type ret; return ret; } 2.友元函数重载操作符 可以将操作符重载函数声明为友元函数. #include <iostream> using namespace std; class Comp

C++--操作符重载 复数类

一.操作符重载 Q:下面的复数解决方案是否可行? class Complex { public: int a; int b; }; int main() { Complex c1={1,2}; Complex c2={3,4}; Complex c3=c1+c2; return 0; } 该段代码想要实现的是将两个复数类进行相加得出第三个类代码实现的运行结果由上面的结果图可以得知,出现的错误是无法匹配+号操作符的操作,同时出现 的潜在问题是a与b是public成员,在实际的操作中应将a与b设置为

【C/C++】操作符重载

常见问题 Q1. 下列运算符,在C++语言中不能重载的是( ). A. * B. ?: C. :: D. delete Q2. 编写类String的构造函数.析构函数和赋值函数. Q3. 复制构造函数与赋值运算符的区别是什么? Q4. 下述代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 class X 4 { 5 public: 6 X() { cout << "constructor" &l

操作符重载!

操作符重载为操作符提供不同的语义 #include <iostream> using namespace std; struct Complex { int a; int b; }; int main() { Complex c1 = {1,2}; Complex c2 = {3,4}; Complex c3 = c1 + c2;//编译出错 cout << "Press any key to continue..." << endl; cin.ge

【学习】操作符重载

2018/8/21 15:16:56 何为操作符重载? 1. 操作符重载就是为了让原有操作符能够作用于用户定义的类型,例如'+'操作符原来只能用于两侧均为数字或字符串的情况,通过操作符重载可以实现如两个时刻相加求和(类似11:20:00 + 1:25:20). 1 class Time(object): 2 def __init__(self,hour=0,minute=0,second=0): 3 self.hour = hour 4 self.minute = minute 5 self.h

C++解析(17):操作符重载

0.目录 1.操作符重载 2.完善的复数类 3.小结 1.操作符重载 下面的复数解决方案是否可行? 示例1--原有的解决方案: #include <stdio.h> class Complex { int a; int b; public: Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } int getA() { return a; } int getB() { return b; } friend Compl

操作符重载的概念

复数计算第一种形式(自定义复数类): 1 #include <stdio.h> 2 3 class Complex 4 { 5 int a; 6 int b; 7 public: 8 Complex(int a = 0, int b = 0) 9 { 10 this->a = a; 11 this->b = b; 12 } 13 14 int getA() 15 { 16 return a; 17 } 18 19 int getB() 20 { 21 return b; 22 }

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定