我现在已经玩Java和C ++了一段时间。在Java中,可以使用不需要使用对象的功能。 (例如:数学课) 在C ++中我试图做同样的事情,但是我不能创建不需要定义对象的类函数。我通常像这样定义类函数:
void myClass::myFunc{ //my func}
我错过了什么?
答案 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();
}
}