非对象函数/类函数C ++

时间:2018-01-16 18:31:09

标签: c++

我现在已经玩Java和C ++了一段时间。在Java中,可以使用不需要使用对象的功能。 (例如:数学课) 在C ++中我试图做同样的事情,但是我不能创建不需要定义对象的类函数。我通常像这样定义类函数:

void myClass::myFunc{ //my func}

我错过了什么?

3 个答案:

答案 0 :(得分:2)

  

在Java中,可以使用不需要对象的函数   使用

C ++甚至更好:你可以使用甚至不需要的函数,即所谓的非成员函数:

void myFunc() {
    // my func
}

使用仅具有static成员函数的类的Java方法在技术上也是可行的:

class MyClass {
public:
    static void myFunc() {
        // my func
    }
};

但是,由于上述事实C ++支持非成员函数,因此很少遇到这样的类,因为它们不需要。

答案 1 :(得分:1)

只需在您的文件中执行此操作即可:

void yay()
{
}

如果您愿意,可以采用Java方法,不需要课程。

答案 2 :(得分:1)

对于可调用的函数,至少存在一些解决方案,而没有为它们创建上下文的任何对象。

静态

就像在Java中一样,你可以在C ++类中的任何方法中使用static关键字。

<强>爪哇

public class MyClass {
    public static void method() {
        doSomething();
    }
}

通过以下方式致电:MyClass.method();

<强> C ++

class MyClass {
public:
    static void method() {
        doSomething();
    }
};

通过以下方式致电:MyClass::method();

您可能知道static允许我们制作&#34;无上下文&#34; 方法(不需要调用者对象)。

在类

之外定义静态方法

可以在C ++类

之外定义方法(不仅是静态)

<强> C ++

class MyClass {
public:
    // Tell the compiler that we have method here
    // but do not provide any code
    static void method();
};

// Provide the code outside class
// NOTE: static keyword was omitted because we have specified
//       that the function is static earlier.
//       When you write the static there it won't compile.
//
void MyClass::method() {
    doSomething();
}

此代码与之前显示的代码相同。

请注意void MyClass::method()附近缺少静态关键字。

C ++标准不允许将链接说明符(在这种情况下,我们的 static 关键字)放在外部类定义附近。

当你在那里放置静态时,GCC编译器会对你大喊:

 cannot declare member function 'static void MyClass::method()' to have static linkage

这个答案的细节有点太深了,但是这个想法是类内部的静态意味着与课外有些不同。

你不必为此烦恼,为什么会这样,只是跳过静止而快乐。

全局范围内的函数

您也可以在全局范围内定义函数。

此方法不适用于Java,因为在Java中没有全局范围,其中所有内容都是类范围的。

<强> C ++

void callMe() {
    doSomething();
}

int main() {
    // The function callMe() is not defined in any class
    // so we call is directly 
    callMe();

    return 0;
}

命名空间

您可以扩展全局范围函数方法以获取名称空间抽象。

命名空间可以理解为一组类/函数和其他名称以某些已定义名称为前缀的实体。

<强> C ++

namespace test {
    void callMe() {
        doSomething();
    }
}

我们在这里找到了一个以callMe()为前缀的函数test

除了事实之外,这是一个普通的普通函数,我们称它为类似符号的表示法:

<强> C ++

int main() {
    test::callMe();

    return 0;
}

命名空间在Java语言中也没有等价物。

最接近的实现是在类中再次创建一个静态函数:

<强>爪哇

public class Test {
    public static void callMe() {
        doSomething();
    }
}