• 《C++程序设计POJ》《WEEK4 运算符重载》《赋值运算符》《运算符重载为友元函数》


    自定义数据类型与运算符重载

    运算符重载的实质是函数重载
    返回值类型 operator 运算符(形参表)
    {
    ……
    }

    运算符可以被重载成普通函数


    也可以被重载成类的成员函数

    #include<iostream>
    
    using namespace std;
    
    /*运算符重载为普通函数
    重载为普通函数时, 参数个数为运算符目数
    */
    
    #if 0
    class Complex
    {
    public:
    
        double real;
        double imaginary;
    
        Complex(double r = 0.0, double i = 0.0)
        {
            real = r;
            imaginary = i;
        }// “类名(参数表)” 就代表一个对象
    
    };
    
    Complex operator+(const Complex & a, const Complex & b)
    {
        return Complex(a.real + b.real, a.imaginary + b.imaginary);
    }
    
    int main()
    {
        Complex a(1, 2), b(2, 3), c;
        c = a + b;
        cout << c.real << "," << c.imaginary << endl;
        while (1);
        return 0;
    }
    #endif
    
    /*运算符重载为成员函数
    重载为成员函数时, 参数个数为运算符目数减一
    */
    class Complex
    {
    private:
        double real;
        double imaginary;
    public:
        // constructor
        Complex(double r = 0.0, double m = 0.0) :real(r), imaginary(m) {}
    
        Complex operator+(const Complex &); //addition
        Complex operator-(const Complex &); //subtraction
    };
    
    //overloaded addition operator
    Complex Complex::operator+(const Complex & operand2)
    {
        return Complex(real + operand2.real, imaginary + operand2.imaginary);
    }
    
    //overloaded subtraction operator
    Complex Complex::operator-(const Complex & operand2)
    {
        return Complex(real - operand2.real, imaginary - operand2.imaginary);
    }
    
    int main()
    {
        Complex x, y(4.3, 8.2), z(3.3, 1.1);
        x = y + z;
        x = y - z;
        return 0;
    
    }

    赋值运算符“=” 只能重载为成员函数

    编写一个长度可变的字符串类String

    包含一个char * 类型的成员变量

    指向动态分配的存储空间

    该存储空间用于存放‘’ 结尾的字符串

    重载赋值运算符的意义–浅复制和深复制

    防止内存垃圾的产生

    深复制/深拷贝

    将一个对象中指针变量指向的内容,

    复制到另一个对象中指针成员对象指向的地方

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    using namespace std;
    
    class String
    {
    private:
        char * str;
    public:
        String() :str(NULL) {} //构造函数, 初始化str为NULL
        const char* c_str() { return str; }
        char* operator = (const char* s);
        ~String();
    
    };
    
    //重载‘=’ obj= “hello”能够成立
    char* String::operator=(const char* s)
    {
        if (str)
            delete[] str;
        if (s) //s不为NULL才会执行拷贝
        {
            str = new char[strlen(s) + 1];//+1存放''
            strcpy(str, s);
        }
        else
            str = NULL;
        return str;
    }
    String::~String()
    {
        if (str)
            delete[] str;
    }
    int main()
    {
        String s;
        s = "good luck,";
        cout << s.c_str() << endl;
        //String s2 = "hello!"; //这条语句要是不注释掉就会出错,需要复制构造函数
        s = "shenzhou 8!";
        cout << s.c_str() << endl;
        while (1);
        return 0;
        
    }

    运算符重载为友元函数

    通常, 将运算符重载为类的成员函数

    重载为友元函数的情况:

    成员函数不能满足使用要求

    普通函数, 又不能访问类的私有成员

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    using namespace std;
    /*普通函数不能访问私有成员
    将运算符+重载为友元函数
    */
    class Complex
    {
        double real, imag;
    public:
        Complex(double r, double i) :real(r), imag(i) {};
        Complex operator+(double r);
        friend Complex operator+(double r, const Complex & c);
    
    };
    // 成员函数
    Complex Complex::operator+(double r)//能解释 c+5
    {
        return Complex(real + r, imag);
    }
    // 友元函数 普通函数 能解释 5 + c
    Complex operator+(double r, const Complex & c)
    {
        return Complex(c.real + r, c.imag);
    }
    int main()
    {
        Complex c(1,2);
        c = c + 5;
        c = 5 + c;
        return 0;
    }
  • 相关阅读:
    浅入ABP(1):搭建基础结构的 ABP 解决方案
    浅入ABP(2):添加基础集成服务
    GDB 调试 .NET 程序实录
    浅入 ABP 系列(6):数据库配置
    浅入 ABP 系列(4):事件总线
    浅入 ABP系列(3):增加日志组件、依赖注入服务
    模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)
    RabbitMQ与Kafka选型对比
    .Net在Windows上使用Jenkins做CI/CD的那些事
    Tomcat乱码问题
  • 原文地址:https://www.cnblogs.com/focus-z/p/11001073.html
Copyright © 2020-2023  润新知