第12-13讲 运算符重载
- 格式:ppt
- 大小:175.50 KB
- 文档页数:59


C++基础系列——运算符重载
1. 运算符重载简介
所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让⼀个函数名有多种功能,在不同情况下进⾏不同的操作。同样运算符重载(OperatorOverloading)可以让同⼀个运算符可以有不同的功能。
可以对 int、float、string 等不同类型数据进⾏操作<< 既是位移运算符,⼜可以配合 cout 向控制台输出数据
也可以⾃定义运算符重载:class Complex
{
public:
Complex();
Complex(double real, double imag);
Complex operator+(const Complex &a) const;
void display() const;
private:
double m_real;
double m_imag;
};
// ...
// 实现运算符重载
Complex Complex::operator+(const Complex &A) const{
Complex B;
B.m_real = this->m_real + A.m_real;
B.m_imag = this -> m_imag + A.m_imag;
return B;
// return Complex(this->m_real + A.m_real, this->m_imag + A.m_imag);
}
int main(){
Complex c1(4.3, 5.8);
Complex c2(2.7, 3.7);
Complex c3;
c3 = c1 + c2; // 运算符重载
c3.display();
return 0;
}
运算结果7 + 9.5i
运算符重载其实就是定义⼀个函数,在函数体内实现想要的功能,当⽤到该运算符时,编译器会⾃动调⽤这个函数,它本质上是函数重载。c3 = c1 + c2;
实验七-运算符重载参考答案
实验七 多态性—函数与运算符重载
7.1 实验目的
1.理解掌握成员函数方式运算符重载;
2.理解掌握友元函数方式运算符重载;
3.理解掌握++、--运算符的重载。
7.2 实验内容
7.2.1程序阅读
1.理解下面的程序,并运行查看结果,回答程序后面的问题。
#include
using namespace std;
class CComplex
{
public:
CComplex()
{
real = 0;
imag = 0;
}
CComplex(int x,int y)
{
real = x;
imag = y;
}
int real;
int imag;
CComplex operator + (CComplex obj1)//---------------------------------------------①
{
CComplex obj2(real - obj1.real, imag - obj1.imag);
return obj2;
}
};
int main()
{
CComplex obj1(100,30);
CComplex obj2(20, 30);
CComplex obj;
obj = obj1+obj2; //------------------------------------------------------------------②
cout << obj.real <
cout << obj.imag << endl;
return 0;
}
问题一:①处的运算符重载,为什么该函数的返回值要设计成CComplex类型?
答:因为在函数中return obj2,obj2是CComplex类型,所以函数返回值要与return返回的类型相同,即设计成CComplex类型。
C++运算符重载三种形式(成员函数,友元函数,普通函数)详
解
三种重载⽅式
⾸先,介绍三种重载⽅式:
1 //作为成员函数重载(常见)
2 class Person{
3 Private:
4 string name;
5 int age;
6 public:
7 Person(const char* name, int age):name(name),age(age){}
8 bool operator<(const Person& b);
9
10 };
11 bool Person::operator<(const Person& b)
12 {
13 //作为成员函数时,*this即为左操作数a
14 ...
15 }
1 //作为友元函数重载
2 class Person{
3 private:
4 string name;
5 int age;
6 public:
7 Person(const char* name, int age):name(name),age(age){}
8 friend bool operator<(const Person& a,const Person& b);
9
10 };
11 bool operator<(const Person& a,const Person& b)
12 {
13 ...
14 }
1 //作为普通函数重载(不推荐)
2 class Person{
3 public://注意,重载运算符为普通函数时,使⽤到的类成员必须为public
4 string name;
5 int age;
6 public:
7 Person(const char* name, int age):name(name),age(age){}
8
9 };
10 bool operator<(const Person& a,const Person& b)
11 {
12 ...
类和对象初步
1. 类的定义 在定义外成员函数的实现
2. 类的成员函数之间可以相互调用,类的成员函数也可以重载,也可设默认参数值
3. 一般来讲,一个对象占用的内存空间的大小等于其成员变量的体积之和。每个对象都有自己的存储空间(成员变量),但成员函数只有一份 对象名.成员名 指针->成员名 引用名.成员名
4. private:一个类的私有成员,只能在该类的成员函数中才能访问 public: proteced:
5. class 默认 private struct默认public
6. 内联成员函数:成员函数名前加inline 或函数体写在类定义内部的成员函数。执行更快,但会带来额外的内存开销
构造函数
1. 构造函数全局变量在堆上,系统自动初始化为零。局部变量在栈上,初始值是随机的,需要初始化。
2. 构造函数:对对象进行初始化。构造函数执行时对象的内存空间已经分配,构造函数的作用是初始化这片空间.可重载,不写的话有默认构造函数,但是如果编写了构造函数,那默认构造函数不会再执行.是一类特殊的成员函数。不写返回值类型,函数名为类名.
3. 对象在生成时一定会调用某个构造函数,一旦生成,不再执行构造函数.
4. P183 Ctest *pArray[3]={new Ctest(4),new Ctest(1,2)}
5. 复制构造函数:其是构造函数的一种,只有一个参数,为本类的引用,防止混淆,构造函数不能以本类的对象作为唯一的参数。 默认复制构造函数。
6. 复制构造函数被调用的三种情形:1用一个对象去初始化另一个对象时Complex C1(C2) Complex
C2=C1; 2 函数的参数是类A的对象。形参未必等于实参 函数中用对象的引用不会调用复制构造函数 void Function(const Complex &c)3 函数的返回值是类A的对象
7. 类型转换构造函数:除复制构造函数外,只有一个参数的构造函数 C=6