我正试图让我的头围绕指针/破坏等等。我正在使用下面的代码来使用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;
答案 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)
时,如果允许,您将: