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