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

Naw*_*waz 14 c++ operators user-defined-functions

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

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

Joh*_*itb 11

一个运营商是一个符号像+,-,+=等等(见13.5).它们没有意义.在语义分析期间,确定运算符的含义.

函数是构造函数,析构函数,转换函数(看起来像operator type())或运算符函数(函数模板特化和实例化可以依次产生这些函数).

一个运营商的功能是什么,实现运营商(见13.5).一个例子是operator+.这些都是各方面的功能,与"通常"功能的唯一区别在于它们可以被隐式调用,并且它们有一个有趣的名称.

有些运算符具有内置含义,可由程序员更改.一个简单地通过说内置运算符来指代运算符的内置含义(参见5/3).但是,如果将这样的运算符应用于定义了内置含义的操作数,则仅在少数情况下允许更改该含义(这些是赋值,地址和逗号运算符,请参阅13.5/6).


Mar*_*ork 7

什么是运营商?

运算符是表达式中使用的符号.
例如:+ - */等

在内置类型中,操作定义明确且不可更改.
对于用户定义的类型,可以将运算符定义为函数/方法调用的语法糖

Array a;
a = b + c; // a.operator=(b.operator+(c));
Run Code Online (Sandbox Code Playgroud)

什么是功能?

我们大多数时候都可以互换地使用术语函数/方法.唯一的区别是方法与类对象的实例相关联.否则他们是一样的.它们提供了将一组指令组合在一起的方法.

他们之间有什么区别?

内置类型的运算符的动作由编译器定义.
操作符对用户定义类型的操作是函数调用.

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

它的功能(或方法).在用户定义的类型上使用运算符是函数调用的语法糖.尽管在正常的谈话中,他们仍然被称为运营商.

操作员可以在编译时操作操作数吗?

对于内置类型是的.编译器具有优化使用的广泛能力.
对于用户定义的类型.它可以对运算符执行优化,就像可能导致消除的其他函数一样,但代码不会在编译时执行.

它们总是在编译时运行吗?(比如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));
}
Run Code Online (Sandbox Code Playgroud)