繁体   English   中英

为什么我们创建一个object时使用object的指针?

[英]Why do we use pointer of object when we create a object?

为什么我们要像这样创建一个新的object时使用object的指针呢?

employee *Steve = new employee();

在这种情况下,我想创建一个名为Steve的 object 。

#include <iostream>
#include <string.h>
using namespace std;

class employee{
private:
    char name[40];
    int salary;
public:
    employee(){
        strcpy(name, "unnamed");
        salary = 0;
    }
    char *getName(){
        return name;
    }
};

int main(){
    employee *Steve = new employee();
    cout<<"Name: "<< Steve->getName();
}

我们不需要指针时,我们不使用指针。 我们想要创建一个 object 时,我们调用构造函数来创建一个 object,但我们不使用new指针或原始指针。

employee Steve;
std::cout << "Name: " << Steve.getName() << "\n";

如果我们动态分配 object 那么我们仍然不使用new指针或原始指针,而是容器指针或智能指针。

在糟糕的教程和有问题的教学中,他们经常使用指针。 通常那是因为他们实际上并不是要教 C++,而是要教指针。 在现代 C++ 中,原始指针的使用仅限于极少数情况。

关于您编写的代码还有更多要说的,但我会保留它并向您推荐权威的 C++ 图书指南和列表

使用动态分配的原因之一(即new在您的示例中,尽管请不要使用原始new ,而是使用更安全的选项,例如std::make_unique )是针对要创建的 object (及其大小)未知的情况在编译时

例如:

struct Person {
   std::string m_strName;
   virtual void print() const { 
      std::cout << "Name: "<< m_strName << "\n"; 
   }
};

struct Employee : Person {
   int m_nSalary{};
   void print() const override { 
      Person::print();
      std::cout << "Salary: "<< m_nSalary << "\n"; 
   }
};

现在假设要实例化这两个类中的哪一个取决于运行时某个变量i的值:

Person* p = nullptr;
if (i > 10)
   p = new Person{};
else
   p = new Employee{};

在这种情况下我们必须使用动态分配

如果您不使用动态分配,则会将 object 放置在堆栈上(与动态分配放置它们的相反)。 由于堆栈空间有限,使用动态分配的另一个原因是创建非常大的对象。 还有一个原因是对象必须在当前 scope 之后持续存在。

根据经验,如果 object 仅在 function 中本地需要(并且具体类型在编译时已知),则通常不需要使用new (或更安全、现代的替代方法之一,如std::unique_ptr in与std::make_unique结合)。

从那以后,最好像这样写你的main function :

int main(){
    employee Steve{};
    cout<<"Name: "<< Steve.getName();
}

同样,如果你必须使用动态分配,更喜欢std::unique_ptr

auto pSteve = std::make_unique<employee>();
cout<<"Name: "<< pSteve->getName();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM