簡體   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