在C++中调用(调用)函数的方式有多少?

ayu*_*ush 4 c++ function

我知道一种调用函数的方法:

func(x, y);
Run Code Online (Sandbox Code Playgroud)

有更多方法可以调用函数吗?

Che*_*Alf 5

可以调用函数

  • 显式地,通过在指定函数之后提供参数括号(在构造函数的情况下,这显然不是正式的正确措辞,因为它们没有名称,但无论如何),

  • 隐式地,特别是析构函数和默认构造函数,还有隐式类型转换,

  • 通过函数调用运算符以外的运算符(),特别是复制赋值运算符=和解除引用运算符->,

  • 在放置new表达式中,通过在后面放置一个参数括号来调用指定的分配函数new(不确定这是否作为一种单独的方式).

此外,图书馆设施当然可以为您调用功能.

我认为以上列表是详尽无遗的,但我不确定.我记得Andrei Alexandrescu 在他的Modern C++ Design书中列举了产生可调用东西的构造,并且给我一个惊喜.因此,上述内容可能并非详尽无遗.


Ton*_*roy 2

可以调用任意函数:

  • 使用f(arguments...)符号

  • 通过指向函数的指针(无论是成员函数还是非函数)

  • 通过std::function- (将检查未指定的实现,尽管我希望它在幕后使用指向函数的指针或指向成员函数的指针,因此没有新的语言功能)

在某些情况下也会调用特定于类的函数:

  • 当在堆栈上创建对象时,以及当动态初始化静态/全局或线程特定的对象或动态分配的对象时,或者使用放置new以及计算表达式时,将调用构造函数

  • 当对象离开作用域、delete线程退出、临时对象被销毁以及显式调用析构函数时,将调用析构函数x.~X()

  • 在表达式求值期间可以调用所有形式的运算符([]+===等)<

任意非成员函数可以通过以下方式运行:

  • 函数可能会由于较早的调用std::atexit()而运行std::at_quick_exit(),如果它们抛出则std::terminate可能会运行

  • 线程创建和异步信号(同样,接口接受指向函数的指针,并且没有理由认为任何实现已经或将使用任何其他技术来实现调度)

特定功能会在非常特定的情况下触发:

  • main()由运行时执行

  • std::unexpectedstd::unexpected_handlerstd::terminate在违反动态异常规范时被调用

也可以使用setjmplongjmp“跳回”函数......不过与调用它不太一样。

虽然不是真正的“C++”,但也可以使用内联汇编语言/链接汇编器来安排函数执行,写入可执行内存。