与 类 共享指针
shared pointers with classes
看到示例代码后,我感到很惊讶。因为当我自己说的时候,我最终明白了智能指针在做什么。不过好像还没有。我真的不明白输出如何显示 2014
。据我所知,就看起来而言,类 是分开的。所以它们之间除了继承、多态、嵌套类等之外没有任何关系。我在研究智能指针时可能会跳过一些重要的点。有人能照亮学生吗?
#include <iostream>
#include <memory>
class classA
{
std::shared_ptr<int> ptA;
public:
classA(std::shared_ptr<int> p) : ptA(p) {}
void setValue(int n) {
*ptA = n;
}
};
class classB
{
std::shared_ptr<int> ptB;
public:
classB(std::shared_ptr<int> p) : ptB(p) {}
int getValue() const {
return *ptB;
}
};
int main()
{
std::shared_ptr<int> pTemp(new int(2013));
classA a(pTemp);
classB b(pTemp);
a.setValue(2014);
std::cout << "b.getValue() = " << b.getValue() << std::endl;
}
原始指针输出2013
代码:
#include <iostream>
#include <memory>
class classA
{
int* ptA;
public:
classA(int * p) {
ptA = new int(*p);
}
void setValue(int n) {
*ptA = n;
}
~classA() {
delete ptA;
}
};
class classB
{
int* ptB;
public:
classB(int *p) : ptB(p) {}
int getValue() const {
return *ptB;
}
};
int main()
{
int* pTemp(new int(2013));
classA a(pTemp);
classB b(pTemp);
a.setValue(2014);
std::cout << "b.getValue() = " << b.getValue() << std::endl;
}
每个std::shared_ptr
对象都有自己的指针(即它有一个指针成员变量),但所有这些指针都指向同一个地方。
让我们举一个使用普通 "raw" 指针的例子:
int* p = new int(2013);
现在你有一个指针 p
指向一些内存。如果我们这样做
int* p2 = p;
然后我们有 两个 指针,但都指向 完全相同的内存。
这类似于shared_ptr
的工作方式,每个shared_ptr
对象都有一个内部指针(一个成员变量),并且每次shared_ptr
被复制(就像你通过它到一个函数)内部成员变量使用 source-objects 指针变量初始化(就像上面例子中初始化 p2
时),导致两个对象的成员指针变量指向同一个内存。
让我们删除智能指针的东西,因为它似乎只是让你感到困惑。
你的第一个代码是这样的,总结一下:
int v = 2013;
int* p1 = &v;
int* p2 = &v;
*p1++; // Makes v = 2014, so *p2 = 2014.
你的第二个版本是这样的:
int v1 = 2013;
int v2 = 2013;
int* p1 = &v1;
int* p2 = &v2;
*p1++; // Makes v1 = 2014, but v2 = 2013
看到示例代码后,我感到很惊讶。因为当我自己说的时候,我最终明白了智能指针在做什么。不过好像还没有。我真的不明白输出如何显示 2014
。据我所知,就看起来而言,类 是分开的。所以它们之间除了继承、多态、嵌套类等之外没有任何关系。我在研究智能指针时可能会跳过一些重要的点。有人能照亮学生吗?
#include <iostream>
#include <memory>
class classA
{
std::shared_ptr<int> ptA;
public:
classA(std::shared_ptr<int> p) : ptA(p) {}
void setValue(int n) {
*ptA = n;
}
};
class classB
{
std::shared_ptr<int> ptB;
public:
classB(std::shared_ptr<int> p) : ptB(p) {}
int getValue() const {
return *ptB;
}
};
int main()
{
std::shared_ptr<int> pTemp(new int(2013));
classA a(pTemp);
classB b(pTemp);
a.setValue(2014);
std::cout << "b.getValue() = " << b.getValue() << std::endl;
}
原始指针输出2013
代码:
#include <iostream>
#include <memory>
class classA
{
int* ptA;
public:
classA(int * p) {
ptA = new int(*p);
}
void setValue(int n) {
*ptA = n;
}
~classA() {
delete ptA;
}
};
class classB
{
int* ptB;
public:
classB(int *p) : ptB(p) {}
int getValue() const {
return *ptB;
}
};
int main()
{
int* pTemp(new int(2013));
classA a(pTemp);
classB b(pTemp);
a.setValue(2014);
std::cout << "b.getValue() = " << b.getValue() << std::endl;
}
每个std::shared_ptr
对象都有自己的指针(即它有一个指针成员变量),但所有这些指针都指向同一个地方。
让我们举一个使用普通 "raw" 指针的例子:
int* p = new int(2013);
现在你有一个指针 p
指向一些内存。如果我们这样做
int* p2 = p;
然后我们有 两个 指针,但都指向 完全相同的内存。
这类似于shared_ptr
的工作方式,每个shared_ptr
对象都有一个内部指针(一个成员变量),并且每次shared_ptr
被复制(就像你通过它到一个函数)内部成员变量使用 source-objects 指针变量初始化(就像上面例子中初始化 p2
时),导致两个对象的成员指针变量指向同一个内存。
让我们删除智能指针的东西,因为它似乎只是让你感到困惑。
你的第一个代码是这样的,总结一下:
int v = 2013;
int* p1 = &v;
int* p2 = &v;
*p1++; // Makes v = 2014, so *p2 = 2014.
你的第二个版本是这样的:
int v1 = 2013;
int v2 = 2013;
int* p1 = &v1;
int* p2 = &v2;
*p1++; // Makes v1 = 2014, but v2 = 2013