C++学习之路——函数重载和运算符重载

简介: C++学习之路——函数重载和运算符重载

一、函数重载


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;
}


结果为:


相关文章
|
13天前
|
存储 安全 编译器
【C++入门】缺省参数、函数重载与引用(下)
【C++入门】缺省参数、函数重载与引用
|
3天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
3天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
10 0
|
3天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
13 0
【C++】string学习 — 手搓string类项目
|
4天前
|
编译器 C语言 C++
【C++从练气到飞升】05---运算符重载(二)
【C++从练气到飞升】05---运算符重载(二)
|
4天前
|
编译器 C++
【C++从练气到飞升】05---运算符重载(一)
【C++从练气到飞升】05---运算符重载(一)
|
6天前
|
编译器 C++
【C++】类与对象(运算符重载、const成员、取地址重载)
【C++】类与对象(运算符重载、const成员、取地址重载)
12 2
|
13天前
|
编译器 C语言 C++
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
【C++入门学习指南】:函数重载提升代码清晰度与灵活性
23 0
|
13天前
|
编译器 C++ 索引
【C++类和对象】拷贝构造与赋值运算符重载(下)
【C++类和对象】拷贝构造与赋值运算符重载
|
13天前
|
存储 编译器 C++
【C++类和对象】拷贝构造与赋值运算符重载(上)
【C++类和对象】拷贝构造与赋值运算符重载