我可以使用一些帮助来理解C ++中的以下内容,特别是运算符和函数之间的区别:
operator+()
功能还是运营商?sizeof()
)答案 0 :(得分:10)
运算符是+
,-
,+=
等符号(见13.5)。它们没有意义。在语义分析期间,确定运算符的含义。
函数是构造函数,析构函数,转换函数(看起来像operator type()
)或运算符函数(函数模板特化和实例化可以依次产生这些函数)。
运算符函数是实现运算符的东西(见13.5)。一个例子是operator+
。这些都是各方面的功能,与“通常”功能的唯一区别在于它们可以被隐式调用,并且它们有一个有趣的名称。
某些运算符具有内置含义,可由程序员更改。一个是通过说内置运算符来引用运算符的内置含义(见5/3)。但是,如果将这样的运算符应用于定义了内置含义的操作数,则仅在少数情况下允许更改该含义(这些是赋值,地址和逗号运算符,请参阅13.5 / 6)。 / p>
答案 1 :(得分:6)
什么是运营商?
运算符是表达式中使用的符号 例如:+ - * / etc
在内置类型中,操作定义明确且不可更改 对于用户定义的类型,可以将运算符定义为函数/方法调用的语法糖
Array a;
a = b + c; // a.operator=(b.operator+(c));
什么是功能?
我们大多数时候都可以互换地使用术语函数/方法。唯一的区别是方法与类对象的实例相关联。否则他们是一样的。它们提供了一种将一组指令组合在一起的方法。
他们之间有什么区别?
运算符对内置类型的操作由编译器定义 操作符对用户定义类型的操作是函数调用。
用户定义的运算符+()是函数还是运算符?
它的功能(或方法)。在用户定义的类型上使用运算符是函数调用的语法糖。尽管在正常的谈话中,他们仍被视为操作员。
运算符可以在编译时对操作数进行操作吗?
对于内置类型是。编译器具有广泛的优化使用率的能力 对于用户定义的类型。它可以对运算符执行优化,就像可能导致消除的其他函数一样,但代码不会在编译时执行。
它们总是在编译时运行吗? (比如C ++中的sizeof())
没有。 sizeof()相对独特。
要显示用户定义类中的运算符与此处的函数一样,这是使用mem_fun_ref的示例
#include <vector>
#include <algorithm>
#include <memory>
#include <functional>
class X
{
public:
// Non standard operators.
// Because std::mem_fun_ref has a known weakness in that it can
// not be used with methods that take parameters be reference.
//
// The principle is the same though. That the operator+ can be
// used anywhere that the add() method can be used.
X& operator+(X* rhs) { return *this;}
X& add(X* rhs) { return *this;}
};
typedef X& (X::*MEMF)(X* rhs);
int main()
{
MEMF p1 = &X::add;
MEMF p2 = &X::operator+;
X value;
std::vector<X> data;
std::for_each(data.begin(),
data.end(),
std::bind2nd(std::mem_fun_ref(&X::operator+),&value));
}
答案 2 :(得分:3)
运算符和函数之间没有任何有意义的区别,除了运算符具有不同的语法。然而,原始运算符不是函数。
答案 3 :(得分:2)
什么是运营商?
operator通常是对给定某种标点符号的变量执行的操作。例如,两个整数之间operator+
的默认行为是添加它们。
什么是功能?
function是一个子程序 - 一个可重复使用的代码块。
他们之间有什么区别?
就用户代码而言,除了语法之外没什么。请注意,如果重写operator||
,operator&&
或(在较小程度上)operator,
,则更改内置运算符语义的语义。在&&
和||
的情况下,您通常将操作短路到不是的操作。对于逗号,您需要确保从左到右计算参数,因为逗号运算符通常以这种方式运行。
用户定义的运算符+()是函数还是运算符?
都不是。它是用户定义的运算符重载。函数名称不能以关键字operator
开头,运算符只是用于调用运算符重载的实际标点符号,即+
或-
。 编辑:请注意,虽然从技术上讲它不是一个函数,但它确实具有函数调用的语义,如@Martin York's excellent answer中所示。
运算符可以在编译时对操作数进行操作吗?它们总是在编译时运行吗? (比如C ++中的sizeof())
不,sizeof
无法重载。如果您想完成某种形式的编译时操作,则需要使用类似template metaprogramming的内容。请注意,如果编译器能够在编译时进行计算,那么当然可能会忽略对重载运算符的调用。
答案 4 :(得分:0)
在C ++中,您可以覆盖应用于类实例时符号+, - ,==等。通过在A类中定义“operator +”方法,您可以告诉编译器如何处理代码,如:
A a, b, c;
c = a + b; // the + here actually calls a.operator+(b)
它也是一个函数,或者更确切地说是一个实例方法,在某种意义上它是被调用的东西。
编辑:另见http://en.wikipedia.org/wiki/Operator_overloading 和http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading
答案 5 :(得分:0)
功能和运营商之间没有太大的区别。您可以将使用运算符(例如'a + b')视为函数运算符+(a,b)的快捷方式,该函数运算符是针对a和b的类型定义的。当然,原始类型(如整数)和一些其他异常的运算符不一定像这样定义。
因此,回答一些具体问题:
用户定义的运算符+()是函数还是运算符?
实现运算符的函数。
运算符可以在编译时对操作数进行操作吗?它们总是在编译时运行吗?
由于它是一个函数,它在运行时运行,但在某些情况下,编译器优化可以在编译时对某些运算符起作用。我不是百分百肯定你为什么这么问,所以也许这里有一些我不知道的东西。
答案 6 :(得分:0)
函数和运算符之间只有两个细微差别。
x+y
或operator+(a,b)
)。operator==
必须具有两个参数)。此规则的例外是函数调用operator()
,可以使用任意数量的任何参数重载。答案 7 :(得分:-2)
以下是运算符和函数之间的一些区别:
操作符不会将其参数压入堆栈,但函数会将其参数推送到堆栈中。
编译器知道运算符的操作,但不知道函数的输出。换句话说,运算符的动作是在编译时定义的,而函数的动作是在运行时定义的。