是否可以使用引用运算符( - >)调用函数而无需分配内存。 我在某些情况下尝试了这段代码
Foo *fooObject;
fooObject->someFunction;
我对此事感到困惑。这在Dev C ++中运行良好,但在visual c ++中崩溃。
答案 0 :(得分:2)
不,它永远不可能使用 - >没有分配内存,因为这个操作符试图取消引用指向对象的指针...因此该对象必须存在。
指向的对象必须存在......这是"内存的分配"这可以在堆栈或堆上完成。
以下语法......
fooObject->func();
相当于
(*fooObject).func()
为了能够*fooObject
,fooObject
指向的对象必须存在。
在您的代码中
Foo *fooObject;
是悬空指针,因为您没有将其指向对象。指针值可能为NULL或指向某个完全随机的内存块:为了尊重它会导致问题,因为无法保证您所引用的内容......这称为"未定义的行为& #34; 强>
要为对象分配内存,可以在堆栈上执行此操作
Foo fooObject;
然后,如果您愿意,可以使用指向对象的指针...
Foo *fooObjectPTR = &fooObject;
但请注意,堆栈上分配的对象只有在范围内时才存在。当它超出范围时,它会被破坏,你的指针将再次成为一个悬空指针,所以不能使用它。
或者您可以像这样在堆上分配
Foo *fooObjectPTR = new Foo();
如果在堆上进行分配,则必须谨慎使用delete
答案 1 :(得分:1)
您可以在没有实例存在的情况下调用类上的静态函数,但是这可以通过使用::
表示法来完成,然后该函数在范围之外的任何特定实例中运行 - 静态成员函数一个类没有隐式this
指针:
class Foo {
public:
static void someFunction(void) {std::cout << "BOO!\n";};
};
...
int main(...) {
Foo::someFunction();
return 0;
}
[class-static]中的标准状态:“静态成员可以 使用类成员访问语法引用,在这种情况下是object-expression 总是被评估。“
与此相反,Microsoft documentation表示The left side of a member-selection operator (. or –>) that selects a static member function is not evaluated
,这意味着以下内容对VC ++有效,但在符合标准的C ++中则无效:
Foo* not_allocated;
not_allocated->someFunction();