对于C ++,在另一个函数中定义函数的可行性规则是什么?

时间:2014-03-03 15:53:21

标签: c++ scope

我已经知道可以在另一个函数体中定义一个函数对象。当我尝试在main函数中定义一个简单函数时,会发生错误。

int main(){
    void f(){}
    return 0;
}

是否可以在另一个函数中定义函数?
一个类及其一些成员函数可以在另一个函数或另一个类主体中单独定义吗? (粗体字编辑)
是否有规则要遵循?

编辑:非常感谢!但是我错过了写作体功能,即大胆的话语,现在它被纠正了。你能告诉更多吗?

edit2:通过第二个问题我应该写:可以在一个名为F的函数中定义的类的成员函数,而类声明也在函数F中,而whatif F是一个类定义吗?就像这两个:

//F is a function
int F(){
    class A{
        int f();
    };
    int A::f(){}
}

// F is a class
class F(){
    class A{
        int f();
    };
    int A::f(){}
}

4 个答案:

答案 0 :(得分:2)

  

是否可以在另一个函数中定义函数?

不直接。没有特别的理由不这样做;语言根本不允许它。你可以在另一个内部声明一个函数;但是你只能在周围的命名空间中定义

您可以定义命名的lambda变量和包含成员函数的本地类。

int main() {
    auto l = []{std::cout << "lambda\n";};
    struct s {static void f() {std::cout << "member\n";}};

    l();
    s::f();
}
  

一个类及其某些成员函数可以在另一个函数或另一个函数中单独定义吗?

类成员只能在类中定义,或者(在非本地类中)在命名空间中定义。除非该类是本地的,否则您无法在另一个函数内定义任何成员;如果它是本地的,则只能在类中定义成员。

答案 1 :(得分:1)

任何函数都应在任何其他函数之外的命名空间区域中定义,但可以在任何函数块范围内声明。

例如

#include <iostream>

void f( int ) { std::cout << "f( int )" << std::endl; }
void f( short ) { std::cout << "f( short )" << std::endl; }

int main()
{
   void f( int );

   f( 1 );

   {
      void f( short );

      f( 2 );
   }
}

对于类,可以在函数内定义类。在这种情况下,它不应具有静态成员函数,并且所有非静态成员函数都应在类中定义。例如

#include <iostream>

int main()
{
   struct Multiply
   {
      constexpr unsigned int operator ()( unsigned int x, unsigned int y ) const
      {
         return ( y == 0 ? 0 : x + operator ()( x, --y ) );
      }
   };

   std::cout << Multiply()( 10, 10 ) << std::endl;
}  

如果在某个名称空间范围内定义了类,则可以分别定义其成员函数。

例如

#include <iostream>

struct Divide
{
    constexpr unsigned int operator ()( unsigned int x, unsigned int y ) const;
};

constexpr unsigned int Divide::operator ()( unsigned int x, unsigned int y ) const
{
    return ( x < y ? 0 : 1 + operator ()( x - y, y ) );
}

int main()
{
   std::cout << Divide()( 100, 10 ) << std::endl;
}  

对于lambda表达式,它们不是函数。实际上,它们是具有已定义的运算符函数的匿名本地类。

答案 2 :(得分:0)

  

是否可以在另一个函数中定义函数?

没有。你可以在任何地方声明一个函数,但你不能定义(即实现)另一个函数内的一个函数(例外是lambda函数)。

  

一个类及其某些成员函数可以在另一个函数或另一个函数中单独定义吗?

我不确定你在这里问的是什么,因为句子不完整。如果你问你是否可以在函数中定义一个类:是的,你可以,但它的用处会有限,因为它只能在函数内定义。

答案 3 :(得分:0)

C ++ 11引入了lambda表达式来在函数中构建可调用对象并捕获变量。要在某个位置定义成员函数,您可能会在类中定义一个lambda成员并为其分配一个lambda。