设为首页 加入收藏

TOP

操作符重载(一)(二)
2019-09-20 11:45:21 】 浏览:83
Tags:操作 重载
a = b = c

复数类测试

main.cpp

#include "Complex.h"
#include <cstdio>

int main()
{
    Complex c1(1, 2);
    Complex c2(3, 6);
    Complex c3 = c2 - c1;
    Complex c4 = c1 * c3;
    Complex c5 = c2 / c1;

    printf("c3.a = %f, c3.b = %f\n", c3.getA(), c3.getB());
    printf("c4.a = %f, c4.b = %f\n", c4.getA(), c4.getB());
    printf("c5.a = %f, c5.b = %f\n", c5.getA(), c5.getB());

    Complex c6(2, 4);

    printf("c3 == c6 : %d\n", c3 == c6);
    printf("c3 != c4 : %d\n", c3 != c4);

    (c3 = c2) = c1;

    printf("c1.a = %f, c1.b = %f\n", c1.getA(), c1.getB());
    printf("c2.a = %f, c2.b = %f\n", c2.getA(), c2.getB());
    printf("c3.a = %f, c3.b = %f\n", c3.getA(), c3.getB());

    return 0;
}

3. 赋值操作符重载和拷贝构造函数

赋值操作符重载与深拷贝

赋值操作符重载和拷贝构造函数具有相同的作用和意义,那么,C++什么时候调用赋值操作符重载函数?什么时候调用拷贝构造函数?

ClassName c1;
ClassName c2 = c1; //调用拷贝构造函数
ClassName c3(c1);  //调用拷贝构造函数

ClassName c4;
c4 = c1;           //调用赋值操作符重载函数

和拷贝构造函数类似

  • 编译器为每个类默认重载了赋值操作符
  • 默认的赋值操作符重载函数仅完成浅拷贝
  • 当需要进行深拷贝时,必须重载赋值操作符

作为一般性原则,重载赋值操作符,必然需要实现深拷贝!!!

#include <iostream>
#include <string>

using namespace std;

class Test
{
    int *m_pointer;
public:
    Test()
    {
        m_pointer = NULL;
    }

    Test(int i)
    {
        m_pointer = new int(i);
    }

    /*拷贝构造函数实现深拷贝*/
    Test(const Test &obj)
    {
        m_pointer = new int(*obj.m_pointer);
    }

    /*重载赋值操作符实现深拷贝*/
    Test &operator = (const Test &obj)
    {
        if (this != &obj)
        {
            delete m_pointer;
            m_pointer = new int(*obj.m_pointer);
        }

        return *this;
    }

    void print()
    {
        cout << "m_pointer = " << hex << m_pointer << endl;
    }

    ~Test()
    {
        delete m_pointer;
    }
};

int main()
{
    Test t1 = 1;
    Test t2;

    t2 = t1;

    t1.print();
    t2.print();

    return 0;
}

数组类IntArray改进

IntArray.h

#ifndef _INTARRAY_H_
#define _INTARRAY_H_

class IntArray
{
public:
    IntArray &operator = (const IntArray &obj); //Add
};

#endif

IntArray.cpp

IntArray &IntArray::operator = (const IntArray &obj)
{
    if (this != &obj)
    {
        int *pointer = new int[obj.m_length];

        if (pointer != NULL)
        {
            for (int i = 0; i < obj.m_length; i++)
            {
                pointer[i] = obj.m_pointer[i];
            }

            m_length = obj.m_length;
            delete m_pointer;
            m_pointer = pointer;
        }
    }

    return *this;
}
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++学习03_对象 下一篇致初学者(四):HDU 2044~2050 ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目