我是一名c++初学者,最近学习了 new运算符重载。在相关的文章种看到了关于operator new函数的介绍。
其中主要代码如下:
void* operator new(size_t size) //针对new+对象
{
cout << "new" << endl;
return operator new(size);
}
当运行此代码后,会进入无限循环中
代码改为:
void* operator new(size_t size) //针对new+对象
{
cout << "new" << endl;
return ::operator new(size);
}
文章的解释是 ,我是对new进行的重载,调用opertor new函数会使进入循环,应将opertor new改为全局性质的 ::operator new(size)
我不理解的是,我明明是对new进行的重载,和opertor new函数有啥关系。为啥调用opertor new 会使代码进入循环?
其中主要代码如下:void* operator new(size_t size) //针对new+对象
{
cout << "new" << endl;
return operator new(size);
}
当运行此代码后,会进入无限循环中代码改为:void* operator new(size_t size) //针对new+对象
{
cout << "new" << endl;
return ::operator new(size);
}
文章的解释是 ,我是对new进行的重载,调用opertor new函数会使进入循环,应将opertor new改为全局性质的 ::operator new(size)我不理解的是,我明明是对new进行的重载,和opertor new函数有啥关系。为啥调用opertor new 会使代码进入循环?operator new函数重载new
(1)1operator new虽然特殊,但它也是函数,你把它当成一个全局类的一个虚函数,你就明白为什么了。void* operator new(size_t size) //针对new+对象
{
cout << "new" << endl;
return operator new(size);
}
就可以被认为是:void* newsth(size_t size) //针对new+对象
{
cout << "new" << endl;
return newsth(size);
}
重载Oprator+符号,再调用oprator+函数,是不是也会一样陷入死循环呢
void* operator new(size_t size) // <---- 这个就是所谓的 "operator new 函数"
{
cout << "new" << endl;
return operator new(size);
}
所有的重载了的运算符,(几乎)都可以用函数的方式(等价地)调用的。
比如 a+b
可以是 a.operator+(b)
或者是 operator+(a,b)
。
所以在 operator new()
的定义里调用了 operator new
,就递归调用了自己,于是就死循环了。
内置运算符对应的“函数”并不一定存在。比如 operator+(1,2)
就会报错。但是重载后的运算符都是函数。
operator new
其实跟 operator new()
函数并不完全对应。
new expresstion 会调用 operator new()
来分配内存,然后还会构造对象。
仅调用 operator new()
函数是不会构造对象的。
所以其实它只是个内存分配函数(allocation fucntion)。重载 operator new ,其实指的也是重载这个内存分配函数。它本身就是一个函数。
C++ 重载运算符和重载函数 C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),它们可用于比较 C++ 内置的数据类型。 您可以重载任何一个关系运算符,重载后的关系运算符可用于比较类的对象。 下面的实例演示了如何重载 < 运算符,类似地,您也可以尝试重载其他的关系运算符。 #include <iostream> using namespace std; cl
主要内容:运算符重载的实现,可重载与不可重载的运算符C# 中支持运算符重载,所谓运算符重载就是我们可以使用自定义类型来重新定义 C# 中大多数运算符的功能。运算符重载需要通过 operator 关键字后跟运算符的形式来定义的,我们可以将被重新定义的运算符看作是具有特殊名称的函数,与其他函数一样,该函数也有返回值类型和参数列表,如下例所示: public static Box operator+ (Box b, Box c) { Box bo
本文向大家介绍c++ *运算符重载,包括了c++ *运算符重载的使用技巧和注意事项,需要的朋友参考一下 运算符重载,对象和指向对象的指针 直接上code 运行结果: t是指向test对象的指针,(*t) 也就是一个test对象。 所以只有 *t才真正的调用了 运算符的重载函数。
我试图重载结构中映射的运算符<<,但得到一个编译错误: 不存在从“std::_rb_tree_const_iterator >”到“std::_rb_tree_iterator >”的合适的用户定义转换
对于一个作业,学生们必须制作一个卡片结构来保存卡片的花色、等级和位图。此结构需要一个重载的" 然而,操作员 事先非常感谢。
C++ 重载运算符和重载函数 类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针"行为。运算符 -> 必须是一个成员函数。如果使用了 -> 运算符,返回类型必须是指针或者是类的对象。 运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,它们会执行其他的任务。比如,当
在《 到底什么时候会调用拷贝构造函数?》一节中,我们讲解了初始化和赋值的区别:在定义的同时进行赋值叫做 初始化(Initialization),定义完成以后再赋值(不管在定义的时候有没有赋值)就叫做 赋值(Assignment)。初始化只能有一次,赋值可以有多次。 当以拷贝的方式初始化一个对象时,会调用拷贝构造函数;当给一个对象赋值时,会调用重载过的赋值运算符。 即使我们没有显式的重载赋值运算符,
四则运算符(+、-、*、/、+=、-=、*=、/=)和关系运算符(>、<、<=、>=、==、!=)都是数学运算符,它们在实际开发中非常常见,被重载的几率也很高,并且有着相似的重载格式。本节以复数类 Complex 为例对它们进行重载,重在演示运算符重载的语法以及规范。 复数能够进行完整的四则运算,但不能进行完整的关系运算:我们只能判断两个复数是否相等,但不能比较它们的大小,所以不能对 >、<、<=