根据C++标准,something.operator=(somethingElse)
和something = somethingElse
之间是否有差异?显式的operator = call和= operator是否有区别?
第一次出现在T& something
的模板中,我想知道是否可以用更易读的第二个版本替换它。
根据C++标准,something.operator=(somethingElse)
和something = somethingElse
之间是否有差异?显式的operator = call和= operator是否有区别?
第一次出现在T& something
的模板中,我想知道是否可以用更易读的第二个版本替换它。
有微小的差别,因为a = b
并不总是对对象a
调用明确操作:
T a = b;
。这不是一个任务,但初始化:它会调用拷贝(或移动)建设a = b;
当是一个内部对象(整数,指针,浮点数,...):在=
运营商是内置一个。T
是可复制的,即使在类上没有声明operator =
,也允许分配,因为编译器使用默认的内置分配运算符。但是,如果operator =
方法存在并且由重载解析规则选择,则赋值运算符将调用它。
不,没有。一个明确的=
运算符在声明合适的operator=
方法的类上调用operator=()
,就像直接调用operator=
方法一样。
这对所有运营商而言都是如此,而不仅仅是=
。这就是类方法意义的定义:它指定将相应的运算符应用于类的实例时执行的操作。
我正要对此+1,直到我读到“对所有操作员而言,这不仅仅是=”。其他运算符允许非成员,所以'a @ b'不能再和'a.operator @ ...'相同。一个可以使一个程序不合格,而另一个不可以,反之亦然。 –
除了在复制初始化上下文之外,短运算符表达式等同于函数表达式。 Table 12 C++标准草案的描述操作的表达式:
转载:
Subclause Expression As member function As non-member function
[over.unary] | @a | (a)[email protected] ( ) | [email protected](a)
[over.binary] | [email protected] | (a)[email protected] (b) | [email protected](a, b)
[over.ass] | a=b | (a).operator= (b) |
[over.sub] | a[b] | (a).operator[](b) |
[over.ref] | a-> | (a).operator->( ) |
[over.inc] | [email protected] | (a)[email protected] (0) | [email protected](a, 0)
哪里@
是用于操作者的占位符。
原因,还有其它上下文使用=
操作者;在函数声明,如拖欠成员函数,删除功能和= 0; // pure virtual
@向下选民,关心评论? – WhiZTiM
请注意内置类型没有'operator ='。如果你有'T.operator =(something)',那么'T'不能是内置类型。 – NathanOliver