C ++中的运算符和函数之间的区别?

时间:2011-01-16 16:32:25

标签: c++ operators user-defined-functions

我可以使用一些帮助来理解C ++中的以下内容,特别是运算符和函数之间的区别:

  • 什么是运营商?
  • 什么是功能?
  • 他们之间有什么区别?
  • 是用户定义的operator+() 功能还是运营商
  • 操作员可以在编译时操作操作数吗?它们总是在编译时运行吗? (如C ++中的sizeof()

8 个答案:

答案 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_overloadinghttp://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading

答案 5 :(得分:0)

功能和运营商之间没有太大的区别。您可以将使用运算符(例如'a + b')视为函数运算符+(a,b)的快捷方式,该函数运算符是针对a和b的类型定义的。当然,原始类型(如整数)和一些其他异常的运算符不一定像这样定义。

因此,回答一些具体问题:

用户定义的运算符+()是函数还是运算符?

实现运算符的函数。

运算符可以在编译时对操作数进行操作吗?它们总是在编译时运行吗?

由于它是一个函数,它在运行时运行,但在某些情况下,编译器优化可以在编译时对某些运算符起​​作用。我不是百分百肯定你为什么这么问,所以也许这里有一些我不知道的东西。

答案 6 :(得分:0)

函数和运算符之间只有两个细微差别。

  1. 操作员可以以两种方式使用(x+yoperator+(a,b))。
  2. 运算符必须具有与内置参数相同数量的参数(operator==必须具有两个参数)。此规则的例外是函数调用operator(),可以使用任意数量的任何参数重载。

答案 7 :(得分:-2)

以下是运算符和函数之间的一些区别:

  1. 操作符不会将其参数压入堆栈,但函数会将其参数推送到堆栈中。

  2. 编译器知道运算符的操作,但不知道函数的输出。换句话说,运算符的动作是在编译时定义的,而函数的动作是在运行时定义的。