[英]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.