#include <iostream>
class A{
public:
A(){std::cout << "basic constructor called \n";};
A(const A& other) {
val = other.x
std::cout << "copy constructor is called \n";
}
A& operator=(const A& other){
val = other.x
std::cout << "\n\nassignment operator " << other.val << "\n\n";
}
~A(){
std::cout << "destructor of value " << val <<" called !!\n";
}
A(int x){
val = x;
std::cout << " A("<<x<<") constructor called \n";
}
int get_val(){
return val;
}
private:
int val;
};
int main(){
// non pointer way
A a;
a = A(1);
std::cout << a.get_val() << std::endl;
a = A(2);
std::cout << a.get_val() << std::endl;
// pointer way
A* ap;
ap = new A(13);
std::cout << ap->get_val() << std::endl;
delete ap;
ap = new A(232);
std::cout << ap->get_val() << std::endl;
delete ap;
return 0;
}
我最初使用默认构造函数创建一个对象,然后将tmp r-value对象A(x)
分配给a
。这最终会调用assignment operator
。所以在这种方法中涉及3个步骤
(非指针方式)
1)构造函数
2)赋值运算符
3)析构函数
当我使用指针时,它只需要两步
(指针方式)
1)构造函数
2)析构函数
我的问题是我应该使用非指针方式来创建新类,还是应该使用指针方式。因为我曾经说过我应该避免使用指针(我知道我也可以在这里使用shared_ptr)。
答案 0 :(得分:1)
经验法则:首选在堆栈上创建对象。在堆栈上创建对象时,内存管理工作较少。它也更有效率。
你什么时候必须在堆上创建对象?
以下是一些需要它的情况:
您需要创建一个对象数组,其中只在运行时才知道数组的大小。
你需要一个对象超出构造它的功能。
您需要存储和/或传递指向基类类型的指针,但指针指向派生类对象。在这种情况下,很可能需要使用堆内存创建派生类对象。