C++ c++;指针赋值运算符重载(不仅仅是对象赋值,而是指针赋值)
有没有办法重载指针赋值运算符? 例如 当C++ c++;指针赋值运算符重载(不仅仅是对象赋值,而是指针赋值),c++,C++,有没有办法重载指针赋值运算符? 例如 当 A *x, *y; x = y; 不,这是不可能的。指针类型是标量类型,但重载运算符需要非标量参数。特别是([over.oper]p6): 运算符函数应为非静态成员函数或具有 至少一个类型为类、类引用、枚举或类引用的参数 枚举 如果有一个二元运算符,其中一个参数是用户定义的类型,另一个是指针,则该运算符可以工作,但在您询问的情况下,两个操作数都是指针。不,这是不可能的。指针类型是标量类型,但重载运算符需要非标量参数。特别是([over.oper]p6)
A *x, *y;
x = y;
不,这是不可能的。指针类型是标量类型,但重载运算符需要非标量参数。特别是([over.oper]p6): 运算符函数应为非静态成员函数或具有 至少一个类型为类、类引用、枚举或类引用的参数 枚举
如果有一个二元运算符,其中一个参数是用户定义的类型,另一个是指针,则该运算符可以工作,但在您询问的情况下,两个操作数都是指针。不,这是不可能的。指针类型是标量类型,但重载运算符需要非标量参数。特别是([over.oper]p6): 运算符函数应为非静态成员函数或具有 至少一个类型为类、类引用、枚举或类引用的参数 枚举 如果有一个二元运算符,其中一个参数是用户定义的类型,另一个是指针,则该运算符可以工作,但在您询问的情况下,两个操作数都是指针。没有“指针赋值运算符”。这是赋值运算符,您将其用于指针操作数 除非至少有一个操作数具有类或枚举类型,否则无法重载运算符。(指针类型不是类类型)。没有“指针赋值运算符”。这是赋值运算符,您将其用于指针操作数
除非至少有一个操作数具有类或枚举类型,否则无法重载运算符。(指针类型不是类类型)。否,因为只有当至少一个参数具有类或枚举类型时才会考虑重载运算符。(指向类类型的指针被视为基本类型,本身不算作“类类型”。) C++标准[over.match.oper]/1-2: 如果表达式中没有运算符的操作数具有类或枚举类型,则假定该运算符为内置运算符,并根据子句[expr]进行解释 如果任一操作数的类型为类或枚举,则可能会声明一个实现此运算符的用户定义运算符函数,或者可能需要进行用户定义转换才能将操作数转换为适合内置运算符的类型。在这种情况下,重载解析用于确定要调用哪个操作符函数或内置操作符来实现该操作符
(尽管您可能会鼓励
A
的用户使用类似类APtr
的智能指针,而不是原始指针来获得所需的行为。)否,因为只有当至少一个参数具有类或枚举类型时才会考虑重载运算符。(指向类类型的指针被视为基本类型,本身不算作“类类型”。)
C++标准[over.match.oper]/1-2:
如果表达式中没有运算符的操作数具有类或枚举类型,则假定该运算符为内置运算符,并根据子句[expr]进行解释
如果任一操作数的类型为类或枚举,则可能会声明一个实现此运算符的用户定义运算符函数,或者可能需要进行用户定义转换才能将操作数转换为适合内置运算符的类型。在这种情况下,重载解析用于确定要调用哪个操作符函数或内置操作符来实现该操作符
(虽然您可能会鼓励
A
的用户使用类似classAPtr的智能指针来代替原始指针来获得所需的行为。)否,但您不能更改应用于内置类型的运算符的含义。指针是内置类型。你想解决的真正问题是什么?这看起来很像一个。我想知道是否可以通过继承实现智能指针,这需要重载指针分配。似乎这是不可能的,它必须作为一个类通过继承其他什么来完成?为什么它需要重载指针赋值?我在想,如果我可以创建smartPtr类,如果其他类想使用smart指针,它只从smartPtr继承。这样,smartPtr类就不必像以前的方式(smartPtr)那样出现在代码中。如果您编写smartPtr
类或类模板,您几乎可以按任何方式定义使用smartPtr
声明的变量的行为。但是不,这样的事情无法改变声明为a*
的变量的行为:这是并且将永远是经典的“哑”指针类型。不,不能改变应用于内置类型的运算符的含义。指针是内置类型。你想解决的真正问题是什么?这看起来很像一个。我想知道是否可以通过继承实现智能指针,这需要重载指针分配。似乎这是不可能的,它必须作为一个类通过继承其他什么来完成?为什么它需要重载指针赋值?我在想,如果我可以创建smartPtr类,如果其他类想使用smart指针,它只从smartPtr继承。这样,smartPtr类就不必像以前的方式(smartPtr)那样出现在代码中。如果您编写smartPtr
类或类模板,您几乎可以按任何方式定义使用smartPtr
声明的变量的行为。但是不,这样的事情是无法改变声明为a*
的变量的行为的:这就是经典的“dum”