是否可以在初始化列表中使用延迟指针

Is it possible to use deferenced pointers in initalization list

本文关键字:延迟 指针 列表 初始化 是否      更新时间:2023-10-16

我正试图了解指针/销毁之类的东西。我使用下面的代码来使用x的指针,而不是标准的int;然而,如果我在构造函数中使用初始化列表,它就不会编译,而如果我只是在构造函数方法中正常分配它,它就可以正常工作。

#include<iostream>
using namespace std;
class Point
{
private:
    int *x;
    int y;
public:
    Point(int x1, int y1):*x(x1),y(y1) {}
    // Copy constructor
    Point(const Point &p2) {*x = *p2.x; y = p2.y; }
   // ~Point(){delete x;}
    int getX()            {  return *x; }
    int getY()            {  return y; }
    void setX(int x1){*x=x1;}
};
int main()
{
    Point p1(10, 15); // Normal constructor is called here
    Point p2 = p1; // Copy constructor is called here
    p2.setX(35);
    // Let us access values assigned by constructors
    cout << "p1.x = " << p1.getX() << ", p1.y = " << p1.getY();
    cout << "np2.x = " << p2.getX() << ", p2.y = " << p2.getY();
    return 0;
}

我还有第二个问题,这是初始化这样的int指针的正确方法:

int *p = new int;
*p = 3;

或者像这样:

int *p;
*p = 3;

我注意到,如果我分配nullptr或0并尝试显示指针,它不会输出任何内容,这是有原因的吗?例如:

int *p = 0;
*p = 3;
cout << *p;

Point(int x1, int y1):*x(x1),y(y1) {}是不允许的语法。您只能初始化初始化列表中的成员,并且*x不是成员。顺便说一句,即使编译器允许,它也会产生未定义的行为——你会取消引用一个未初始化的指针。

一种方法(至少在语法上是正确的,并且不会导致这条线上的未定义行为)是

 Point(int x1, int y1): x(new int(x1)), y(y1) {}

第二个问题实际上与第一个问题相同。在第二个示例中,您将在不首先初始化指针的情况下访问指针,这将导致未定义的行为。

当构造函数被调用Point(int x1, int y1):*x(x1)时,您的x地址是不正确的(未分配),因为它没有初始化,所以它可以指向RAM中的任何位置。

当你做*x(x1)时,如果允许,你会:

  • 要么破坏您当前的内存
  • 任一segfault