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