【问题标题】:What is a pointer of int data type pointing at if is a private data member of a class and we create two objects of that class?如果是一个类的私有数据成员并且我们创建该类的两个对象,那么指向 int 数据类型的指针是什么?
【发布时间】:2020-07-06 05:15:05
【问题描述】:

我有一个稀疏矩阵的类。假设它有一个 int 数据类型的指针 a 作为私有数据成员。那么我的问题是,如果我创建该类的两个对象BCBC 是否都有一个指向同一位置的指针a 或者他们会做其他事情?

我在这里很困惑。


我的类中的 actual 指针被定义为私有成员,因此:

element* ele;

它在构造函数中被赋值为:

ele = new element[this->num_non_zero];

【问题讨论】:

  • 取决于实现。查看拷贝构造函数拷贝赋值运算符
  • 这完全取决于代码。默认情况下,复制构造函数将使两个指针指向同一位置。如果您想要不同的东西,那么您必须编写自己的复制构造函数而不是使用默认值。赋值运算符也是如此。
  • @DmitryKuzminov 我没有创建复制构造函数,我想它甚至不是必需的,因为我不希望对象对数据成员具有相同的值。
  • @ArthurMorgan 这恰恰是错误的方式。如果您不希望指针具有相同的值,那么您确实需要编写一个复制构造函数。

标签: c++ class object pointers debugging


【解决方案1】:

现在我们可以看到您正在讨论的代码,您拥有的指针以下列方式声明和初始化(在构造函数中):

Element *ele;
ele = new element[this->num_non_zero];

new 的使用为每个实例提供了它们自己的ele 变量指向的内存自己的副本。使用这种方法,不同实例之间不可能相互干扰。

以下是原始答案,在您添加deail 之前,我们可以简洁地回答您的问题。因为它提供了有趣的背景信息,所以我把它留在了。


除非成员变量是类级别的静态变量(在类的所有实例之间共享),否则它属于实例本身,并且将指向它设置的任何位置(可能但不一定在构造函数中)。

例如,请参见以下代码,它同时具有静态和非静态成员变量:

#include <iostream>
#include <string>

class demo {
public:
    demo(int newnonstat = 7, int newstat= 42): nonstat(newnonstat) {
        std::cout << "create\n";
        stat = newstat;
    }
    void dump(std::string desc) {
        std::cout << desc << ": " << nonstat << ' ' << stat << '\n';
    }
private:
    int nonstat;
    static int stat;
};
int demo::stat;

int main() {
    demo d1; d1.dump("d1");
    demo d2(1, 2); d2.dump("d2"); d1.dump("d1");
}

其输出显示了如何设置这两种类型的可能性(带有我添加的评论):

create
d1: 7 42
create
d2: 1 2
d1: 7 2 <-- "corrupted" static

因此,除非它们是静态的,否则变量将是不同的。然而,作为指针,没有什么可以阻止指向同一事物的不同指针,这一切都归结为不同的代码位将其设置为什么。

另一个例子,指向同一事物的不同指针:

#include <iostream>
#include <string>

class demo {
public:
    demo(char *pStr) : m_pStr(pStr) {}
    void dump(std::string desc) {
        std::cout << desc << ": " << &m_pStr << ' ' << (void*)m_pStr << " '" << m_pStr << "'\n";
    }
private:
    char *m_pStr;
};

int main() {
    char buff[] = "same string";
    demo d1(buff);
    demo d2(buff);

    d1.dump("d1");
    d2.dump("d2");
}

输出显示指针,虽然不同(第二列是指针变量的地址),但指向相同的东西(第三和第四列):

d1: 0x7ffea260c150 0x7ffea260c18c 'same string'
d2: 0x7ffea260c158 0x7ffea260c18c 'same string'

【讨论】:

  • 不,成员变量不是静态的。所以我假设你是说 B 和 C 会有不同的“a”副本指向不同的位置。
  • @ArthurMorgan:他们有单独的 指针, 是的。但是没有什么能阻止他们指向同一个地址。这完全取决于您将它们设置为什么。
  • @ArthurMorgan 他根本没有说那样的话。你似乎很坚决地相信这个不正确的信息。
  • @john 不,伙计,我不是下定决心相信任何事情,无论是对是错,只是我最近开始使用 c++,而且我认为我总是因为某些原因弄乱我的代码基本细节。
  • @ArthurMorgan 好的,很好理解,如果您希望在复制对象时修改指针成员的值,那么您需要编写一个复制构造函数来进行修改。它不会自动发生。赋值运算符也是如此。
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多