C++ 运算符函数调用机制

C++ 运算符函数调用机制,c++,operator-overloading,C++,Operator Overloading,运算符函数的调用与普通函数调用类似吗? 遇到函数调用时,其局部变量、参数和返回地址将加载到调用堆栈中。当我们使用操作符时会发生这种情况吗?如果发生这种情况,那么应该在执行完成后从堆栈中删除运算符函数,对吗? 好吧,我的某些部分说它不会以这种方式发生,因为我们正在返回一个对本地对象的引用,在执行完成后,它将被销毁。 我只想知道它的细节 #include <stdio.h> class OUT {}; OUT & operator<<(OUT & out,

运算符函数的调用与普通函数调用类似吗? 遇到函数调用时,其局部变量、参数和返回地址将加载到调用堆栈中。当我们使用操作符时会发生这种情况吗?如果发生这种情况,那么应该在执行完成后从堆栈中删除运算符函数,对吗? 好吧,我的某些部分说它不会以这种方式发生,因为我们正在返回一个对本地对象的引用,在执行完成后,它将被销毁。 我只想知道它的细节

#include <stdio.h>
class OUT
{};

OUT & operator<<(OUT & out, int x)
{
printf("%d",x);
return out;
}    

int main()
{
OUT print;
print<<3<<4;   
}
#包括
分类
{};

OUT&operator是的,重载运算符函数的使用在语义上是函数调用

<>在C++标准中,强调煤矿:

如果[运算符表达式中]任一操作数的类型为类或枚举,则可能会声明一个实现此运算符的用户定义运算符函数,或者可能需要用户定义的转换来将操作数转换为适合内置运算符的类型。在这种情况下,重载解析用于确定要调用哪个操作符函数或内置操作符来实现该操作符。因此,运算符符号首先转换为等效函数调用符号,如表12所示

因此,关于对象生命周期的标准规则以完全相同的方式应用。编译器对调用堆栈等幕后事物的操作也没有必要有所不同


您的示例很好,不是因为运算符函数有特殊之处,而是因为它不返回对本地对象的引用。在
中返回
out
使用引用类型命名函数参数,因此它引用函数范围之外的其他对象。在这种情况下,
out
指的是
main
中的变量
print
,并且
print
的生存期到
main

的末尾。是的,重载运算符函数的使用在语义上是函数调用

<>在C++标准中,强调煤矿:

如果[运算符表达式中]任一操作数的类型为类或枚举,则可能会声明一个实现此运算符的用户定义运算符函数,或者可能需要用户定义的转换来将操作数转换为适合内置运算符的类型。在这种情况下,重载解析用于确定要调用哪个操作符函数或内置操作符来实现该操作符。因此,运算符符号首先转换为等效函数调用符号,如表12所示

因此,关于对象生命周期的标准规则以完全相同的方式应用。编译器对调用堆栈等幕后事物的操作也没有必要有所不同


您的示例很好,不是因为运算符函数有特殊之处,而是因为它不返回对本地对象的引用。在
中返回
out
使用引用类型命名函数参数,因此它引用函数范围之外的其他对象。在这种情况下,
out
指的是
main
中的变量
print
,并且
print
的生存期到
main

的末尾。对对象的引用超过其生存期本身并不是无效的。使用它的一个成员可能是--但它除了隐式成员函数之外没有其他成员。请记住,“工作”并不意味着“正确”:当程序有未定义的行为时,无法保证会发生什么,因此实际发生什么的一种可能性正是有人想要的。OUT&operator对对象的引用在其生命周期后本身并不是无效的。使用它的一个成员可能是--但它除了隐式成员函数之外没有其他成员。请记住,“工作”并不意味着“正确”:当程序有未定义的行为时,无法保证会发生什么,因此实际发生的一种可能性正是某人想要的。