在指针方式和非指针方式之间选择哪一个?

时间:2017-02-03 18:34:12

标签: c++11

#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)。

1 个答案:

答案 0 :(得分:1)

经验法则:首选在堆栈上创建对象。在堆栈上创建对象时,内存管理工作较少。它也更有效率。

你什么时候必须在堆上创建对象?

以下是一些需要它的情况:

  1. 您需要创建一个对象数组,其中只在运行时才知道数组的大小。

  2. 你需要一个对象超出构造它的功能。

  3. 您需要存储和/或传递指向基类类型的指针,但指针指向派生类对象。在这种情况下,很可能需要使用堆内存创建派生类对象。