gpt4 book ai didi

c++ - 是否可以在初始化列表中使用解除引用的指针

转载 作者:行者123 更新时间:2023-11-28 00:07:50 25 4
gpt4 key购买 nike

我正在努力解决指针/破坏等问题。我正在使用下面的代码为 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) {}

第二个问题其实和第一个是一样的。在第二个示例中,您将访问指针而不先对其进行初始化,这将导致未定义的行为。

关于c++ - 是否可以在初始化列表中使用解除引用的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34534885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com