C++ 重载新运算符

C++ 重载新运算符,c++,operator-overloading,overriding,C++,Operator Overloading,Overriding,我在类中重载运算符“new”时遇到问题 代码: 时间 #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(

我在类中重载运算符“new”时遇到问题

代码:

时间

#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
我不明白为什么我的对象在内存中有其他地址。我认为如果我返回指针,那么我的对象timeNew(在prog.cpp中)应该与time.cpp中的存储地址相同

我知道这是一个函数,但我使用了指针,所以返回程序后不应该删除它

为什么timeNew有0小时零分钟?我在函数中为值签名


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

注意:正如StoryTeller在评论中指出的,在调用构造函数之前访问对象通常是一种非常糟糕的做法,可能会出现危险的bug。这几乎是不必要的。除非您有意实施肮脏的黑客攻击,否则您可能不应该这样做。请记住,C++中的新操作符与Python中可能发现的完全不同,例如,它用于创建不可变类型。 为什么timeNew有0小时零分钟?我在新函数中赋值

这是因为在运算符
new
之后,将调用构造函数,并且由于您未传递任何参数,在您将
12
分配给
minutes
之后,构造函数将重置
minute
hours
的值

如果您想在
operator new
中查看此分配的效果,只需更改:

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


&timeNew
是指针的地址,而不是指针对象!重载分配是一个相当高级的主题。好啊我懂了。但是,当我在操作符函数(我将编辑我的帖子)中签署某个值时,timeNew为零。为什么?我不能用新签东西。我知道它没有意义,但我想知道。说真的,看一下推荐的阅读材料。有太多的基本原则你都不知道。我不是在贬低你,但是C++不是一个要通过反复试验来学习的语言。你首先需要基础知识。然后您就会知道
操作符new
只分配存储,对象构造作为第二步进行将在从
操作符返回后初始化对象new
。顺序是:先分配内存,然后调用构造函数。谢谢。我删除了我的构造函数,写了一个空的(绕过默认构造函数),现在可以工作了。我现在正在阅读C++底漆加史蒂芬PrATA。你真的真的不应该把原始存储当作一个对象。@ StytTele:这只是为了解释我的想法,我知道这不是一个好的编码实践,但是为什么它是危险的?对象不需要是POD。暗示没问题可能会无意中鼓励此答案的读者调用成员函数。类型越复杂,就越有可能造成灾难。最好按照标准的规定去做。在c'tor运行之前,那里没有对象,只有存储。@StoryTeller哦,我明白了,你的意思是OP在新操作符中所做的非常糟糕?事实上,我同意这一点。我以为你指的是我在回答中写的内容。只是补充一下:不这样做的两个很好的原因是可以继承运算符new,因此尚未构造的对象不一定是“类时间”,如果时间对象是动态分配的类的成员,则不会调用此new,从而跳过初始化。
#include <iostream>
#include "time.h"

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

    return 0;
}
0104F5E8
0 hours and 0 minutes
0104F5E8
 Time(int a = 0, int b = 0) : hours(a), minutes(b) {};
 Time(int a, int b) : hours(a), minutes(b) {};
 Time() {};