是否可以在初始化列表中使用延迟指针
Is it possible to use deferenced pointers in initalization list
我正试图了解指针/销毁之类的东西。我使用下面的代码来使用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
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 如何仅为一个函数添加延迟
- 用于对编译时字符串进行哈希处理的延迟指针
- 内联lambda是否遭受与函数指针间接寻址相同的延迟
- 我可以使用GCC通过存储的函数指针内联延迟调用吗
- 是否可以在初始化列表中使用延迟指针
- C++指针在使用之前要延迟
- C++指针延迟声明语法