C++11 在指针方式和非指针方式之间选择哪一种? #包括 甲级{ 公众: A(){std::cout

C++11 在指针方式和非指针方式之间选择哪一种? #包括 甲级{ 公众: A(){std::cout,c++11,C++11,经验法则:更喜欢在堆栈上创建对象。在堆栈上创建对象时,内存管理的工作量更少。效率也更高 何时必须在堆上创建对象 以下是一些需要它的情况: 您需要创建一个仅在运行时才知道数组大小的对象数组 你需要一个对象来超越它所构造的函数 您需要存储和/或传递指向基类类型的指针,但该指针指向派生类对象。在这种情况下,派生类对象很可能需要使用堆内存创建 在“现代”C++(C++ 11)中,指针很少在多态性之外。为什么要这样说呢?因为STD::移动?因为STD::移动避免赋值操作符,并且您可以很容易地在“非指针方式

经验法则:更喜欢在堆栈上创建对象。在堆栈上创建对象时,内存管理的工作量更少。效率也更高

何时必须在堆上创建对象

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

  • 您需要创建一个仅在运行时才知道数组大小的对象数组

  • 你需要一个对象来超越它所构造的函数

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


  • 在“现代”C++(C++ 11)中,指针很少在多态性之外。为什么要这样说呢?因为STD::移动?因为STD::移动避免赋值操作符,并且您可以很容易地在“非指针方式”的一个步骤中进行初始化,例如,例如“代码> A=1;< /Calp>或<代码> A(1)。;,从而跳过赋值步骤。您似乎需要它,它将以正确的方式清楚地指导您。但是,使用堆栈方法时需要执行的赋值运算符又如何呢。1.除非您愿意,否则不需要赋值。您创建的对象具有正确的开始值。2.赋值对于imple类,如您在文章中所做的。(以前是第一条注释,但我需要对其进行编辑)您不必对可变长度数据使用堆,您知道,只要在堆栈上分配之前检查大小…(现在是R Sahu关于“更精细点”的注释)@RSahu当你说除非需要,否则我不必使用assign时是有道理的谢谢你的回复
    #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;
    }