在构造函数中初始化指针的正确方法

Right way to initialize a pointer in a constructor

本文关键字:方法 指针 构造函数 初始化      更新时间:2023-10-16

我有以下练习:

添加代码使其正常运行

class MyInt
{
public:
private:
    int* MyValue;
}
int main(int argc,char** argv)
{
 MyInt x(1);
 ...//a bit more code where the actual value of x is going to be used.
 return 0;
}

我添加了一个私有属性

int val;

和一个公共构造函数

Myint(int x)
{
    val = x;
    MyValue = &val;
}

我添加了int val作为构造函数将非临时对象的地址赋值给MyVal的一种方式,如x.

是否有一种简洁的方法来回答这个问题?

我在您的原始问题声明中没有看到任何要求将指针初始化为int的地址的内容。修复该示例所需的最小代码是添加一个构造函数,该构造函数接受int,并将MyValue初始化为nullptr

class MyInt
{
public:
    MyInt(int) {}
private:
    int* MyValue = nullptr;
};
int main(int argc,char** argv)
{
 MyInt x(1);
 return 0;
}

如果你的编译器不支持c++ 11,那么

class MyInt
{
public:
    MyInt(int) : MyValue(NULL) {}
private:
    int* MyValue;
};

另一种说法:

MyInt(int x) : MyValue(new int(x)) {}

不需要额外的成员。但是,必须确保在析构函数中释放了内存。

~MyInt() { delete MyValue; }

我不太确定为什么要在类中存储指向int的指针,而不是直接存储值(并且不是有指针作为构造函数的输入),但假设您确实想要这样做,以下是您将如何做到的:

MyInt(int x):MyValue(new int(x)){}

但是这是非常非常糟糕的风格,你必须有一个很好的理由这样做。您还需要记住在类销毁时释放指针:

~MyInt(){delete MyValue;}