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

时间:2015-12-30 18:15:43

标签: c++ pointers

我正试图让我的头围绕指针/破坏等等。我正在使用下面的代码来使用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;

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

执行*x(x1)时,如果允许,您将:

  • 要么破坏你当前的记忆
  • segfault