重载新运算符

时间:2017-09-14 08:52:22

标签: c++ operator-overloading override

我在班上重载运算符'new'时遇到问题。

代码:

time.h中

#ifndef TIME_H_
#define TIME_H_

#include <cstddef>
#include <stdlib.h>

class Time {
private:
    int hours;
    int minutes;

public:
    Time(int a = 0, int b = 0) : hours(a), minutes(b) {};

    void AddMin(int m);
    void AddHours(int h);
    void Reset(int h = 0, int m = 0);
    void Show() const;

    Time Suma(const Time & t) const;


    //przeladowania
    void* operator new(size_t);

};
#endif

time.cpp

 #include "time.h"
#include <iostream>
#include <cstddef>
#include <stdlib.h>

void Time::AddMin(int m)
{
    this->minutes += m;
    this->hours += this->minutes / 60;
    this->minutes += this->minutes % 60;
}

void Time::AddHours(int h)
{
    this->hours += h;
}

void Time::Reset(int h, int m)
{
    this->hours = h;
    this->minutes = m;
}

void Time::Show() const
{
    std::cout << this->hours << " hours and " << this->minutes << " minutes" << std::endl;
}

////overloading
void* Time::operator new(size_t size)
{
    void *storage = malloc(size);
    if (NULL == storage) {
        throw "allocation fail : no free memory";
    }
    std::cout << storage << std::endl;
    Time * time = (Time*)storage;
    time->minutes = 12;

    return time;
}

prog.cpp

#include <iostream>
#include "time.h"

int main()
{
    Time * timeNew = new Time();
    timeNew->Show();
    std::cout << timeNew << std::endl;

    return 0;
}

结果 - addreses:

0104F5E8
0 hours and 0 minutes
0104F5E8

我不明白为什么我的对象在内存中有其他地址。我想如果我返回指针,那么我的对象timeNew(在prog.cpp中)应该与time.cpp中的存储具有相同的地址。

我知道它是一个函数,但是我使用了指针,因此在返回程序后它不应该删除。

为什么timeNew有0小时0分?我在功能上签名。

你能解释一下我做错了什么吗?

1 个答案:

答案 0 :(得分:-1)

注意:正如StoryTeller在评论中指出的那样,在调用构造函数之前访问对象通常是一种非常糟糕的做法,并且可能容易出现危险的错误。它几乎从来没有必要。除非你故意实施肮脏的黑客攻击,否则你可能不会这样做。请记住,c ++中的new运算符与python中的新运算符完全不同,例如,它用于创建不可变类型。

  

为什么timeNew有0小时0分?我在新函数中指定了一个值。

这是因为在运算符new之后,调用构造函数并且由于您没有传递参数,构造函数将在您分配{{1}后重置minutehours的值转到12

如果您想在minutes中查看此作业的效果,只需更改:

operator new

使用:

 Time(int a = 0, int b = 0) : hours(a), minutes(b) {};