微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指向对象的指针如何工作?

如何解决指向对象的指针如何工作?

我是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_ptrstd::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 举报,一经查实,本站将立刻删除。