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


结果为:


相关文章
|
3月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
82 0
|
29天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
30天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
1月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
21 1
|
30天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
25 0
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
2月前
|
C++
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持