如何解决指向对象的指针如何工作?
我是c ++的新手,试图理解指针。我在某处阅读了一个示例,如下所示:
#include<iostream>
#define N 5
using namespace std;
class Test {
int x,y;
public:
Test(int a,int b)
: x(a),y(b)
{
}
void print()
{
cout << x << " " << y << endl;
}
};
int main()
{
Test **arr = new Test*[N];
for (int i = 0; i < N; i++) {
arr[i] = new Test(i,i + 1);
}
for (int i = 0; i < N; i++) {
arr[i]->print();
}
}
所以,在一行
Test **arr = new Test*[N];
据我了解,**arr
表示它是指向对象的指针。因此,当我们将其分配给new Test*[N]
时,是否意味着*arr
存储了N个对象指针的地址?
如果正确,那么如何从对象数组中打印对象的地址?假设我要打印对象Test [3]的地址?
解决方法
在现代C ++中,有比拥有拥有原始指针更好的替代方法,还有比手动new
建立数组更好的替代方法。
有容器(例如std::vector
)和智能指针(例如std::unique_ptr
和std::shared_ptr
)。
多态性需要通过指针(包括智能指针)或引用来完成,但这不是发布代码中的因素。
OP发布的代码存在内存泄漏,因为它没有清除arr
。在这类小型程序中,内存泄漏有时会被手动消除并被忽略。
对于您发布的代码,我将以这种方式完成,从而完全消除了指针:
#include <iostream>
#include <vector>
using std::cout;
using std::vector;
constexpr int N = 5;
class Test {
int x;
int y;
public:
Test(int x_,int y_)
: x{x_},y{y_}
{ }
void print() const {
cout << x << " " << y << "\n";
}
};
int main() {
vector<Test> arr;
for (int i = 0; i < N; i++) {
arr.emplace_back(Test{i,i+1});
}
for (auto const& test : arr) {
test.print();
}
}
我不得不添加一些const正确性。在此特定示例中,我依靠vector
且不需要指针或智能指针。
在我过去的C ++编程十年中,我从来不需要使用new
或拥有的原始指针。
原始指针仍然适用于可能为nullptr的非所有权参数和可能为nullptr的非所有权返回值。但是由于它们是非所有者,因此无需担心内存管理。
更新:
“ ...试图理解指针...”
注意事项。不幸的是,我关于“我将如何执行此类程序的示例”并没有使其符合OP试图理解指针的目标。这种主题实际上有点宽泛,应该在good C++ book的第一章或第二章中进行全面介绍。
,第一个问题的答案是“是”。
对于第二个问题,您可以将指针发送到cout而不用取消引用。
cout << arr[3];
或使用C的printf函数:
printf("%p",arr[3]);
如果要从方法中打印它,请使用 this 指针:
void print()
{
cout << this << "- " << x << " " << y << endl;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。