无法为 class 中的变量赋值

Can't assign a value to a variable inside a class

#include <iostream>

using namespace std;

class Foo {

    int i;
    int * p = new int;
    *p = 5; // This doesn't worl
    // If I instead use  int * p = new int(5); it works.
};

为什么?我看到这只发生在 class 中,如果我在主函数上编写相同的代码它应该可以工作。

此语法无效。您不能简单地在 class 定义中编写代码。相反,您可以编写一个函数,您的代码将在其中运行:

class Foo {
public:
  void bar() {
    int * p = new int;
    *p = 5;
  }
};

int main(int argc, char ** argv) {
  Foo f;
  f.bar();
}

注意:您应该尽可能在一条语句中分配和初始化您的变量:

int *p = new int(5);

而不是:

int * p = new int;
*p = 5;

我写这篇文章的假设是您需要动态分配一个成员,并且您不能出于任何原因简单地将参数传递给它的 c'tor(class 应该重新设计,但是这是另一个问题)。

要在 class 定义中执行一些语句作为初始化变量的一部分,您可以将其包装在 lambda 中,并立即调用它:

class Foo {
    int i;
    int * p = []() {
        auto *ret = new int;
        *ret = 5;
        return ret;
    }(); // <-- Invokes the lambda right away
};

只允许在命名空间和 class 范围内进行初始化。其他语句必须出现在 lambda 提供的块范围内。

但它很混乱,不明智,除非你真的必须这样做,否则你不应该这样做。构造函数定义会更好。

A class 定义由其成员声明组成(如果 class 包含成员)。您不能在 class 定义中使用声明以外的语句。

此语句在您的 class 定义中

*p = 5; // This doesn't worl

不是声明。而不是这两个语句

int * p = new int;
*p = 5; // This doesn't worl

你可以只写声明

int * p = new int( 5 );

注意标准智能指针 std::unique_ptr 可以用来代替 class 定义中的原始指针。在这种情况下,当对象不再存在时,内存将自动释放。例如

std::unique_ptr<int> p{ new int(5) };