C++创建类对象方法和动态对象数组

最近在学C++,在内存管理这里遇到几个点,记录一下加深记忆。

创建类对象的方法

C++中有两种创建对象的方法,一种是直接声明,另一种则是使用new关键字,虽然作用相同,但是它们底层的存储方式却完全不同。在此之前,我们先了解一下C++程序的存储形式。
C++程序的内存格局通常分为四个区:
1. data area(全局数据区)
2. code area (代码区)
3. stack area (栈区)
4. heap area (堆区)

其中,堆区就是“自由存储区”,我们的new就是在堆区中申请内存的。回归正题,C++的第一种类对象的创建方法,直接声明:

#include <iostream>
using namespace std;

class Demo{
public:
    Demo(char* str)
    {
        name = str;
        cout << this->name << " come out"  << endl;
    }
private:
    string name;
};

int main(){
    Demo object1("object1");
}

image

这种方法创建时,会在栈区开辟内存空间,这时内存管理由C++自己处理。但是,我们的栈区是有限的,而且一般空间不大,所以new就派上用场了!
一般来说,堆区的空间是足够大的,而在其中申请的内存空间,要由程序员自己管理。也就是说,当我们new一个变量之后,如果之后不用了,就必须手动delete,否则,就会造成内存泄漏。

用new方法创建对象的方法如下:

int main(){
    //Demo object1("object1");
    Demo *object2 = new Demo("object2");
    delete object2;
}

image

创建动态对象数组

C++中,创建对象数组很简单,方法如下:

#include <iostream>
using namespace std;

class Demo{
public:
    Demo(){
        cout << "A Demo..." << endl; 
    }
    Demo(char* str)
    {
        name = str;
        cout << this->name << " come out"  << endl; 
    }
private:
    string name;
};

int main(){
    Demo objs[10];
}

但是,如果类没有默认构造方法,上面的方法就会报错,面对没有默认构造方法的类的对象数组的构造方法如下:

#include <iostream>
using namespace std;

class Demo{
public:
    /* Demo(){
        cout << "A Demo..." << endl; 
    } */
    Demo(char* str)
    {
        name = str;
        cout << this->name << " come out"  << endl; 
    }
private:
    string name;
};

int main(){
    // Demo objs[10]; // error;
    Demo *objs = new Demo[10];
    Demo **objs = new Demo *[10];
    for (int i = 0; i < 10; i++)
    {
        objs[i] = new Demo("object");
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,641评论 1 32
  • 前言 不知道大家有没有这样一种感觉,程序员的数量井喷了。可能是因为互联网火了,也可能是各家培训机构为我们拉来了大量...
    活这么大就没饱过阅读 2,838评论 6 25
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,570评论 1 14
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,706评论 1 4
  • 淡淡的思念,温暖了岁末的秋天。那些长长的牵挂,如藤,在秋风中,兀自光秃秃的纠缠,大雁已远去,写好的长信没来得...
    与心漫步阅读 376评论 0 2

友情链接更多精彩内容