zoukankan      html  css  js  c++  java
  • C++创建对象的三种方式

    C++在创建对象的时候,有三种方式:

    #include <iostream>
    using namespace std;
    
    class A
    {
    private:
        int n;
    public:
        A(int m):n(m)
        { }
        ~A(){}
    };
    int main()
    {
        A a(1);  //栈中分配
        A b = A(1);  //栈中分配
    	
        A* c = new A(1);  //堆中分配
      delete c;
        return 0;
    }
    

      第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放。采用第三种方式时,必须注意一下几点问题:

    1. new创建类对象需要指针接收,一处初始化,多处使用
    2. new创建类对象使用完需delete销毁
    3. new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
    4. new对象指针用途广泛,比如作为函数返回值、函数参数等
    5. 频繁调用场合并不适合new,就像new申请和释放内存一样
    6. 栈的大小远小于堆的大
    7. 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

    提示:

    对于栈的效率比堆要高的多这件事,你可以通过在代码中设置断点来看构造函数的执行过程,在堆中分配内存要经过好多的库函数的执行。

     C++并不像Java和C#这样的纯粹的面向对象的编程语言:类类型是引用类型,必须在堆内存中开辟对象空间,结构体是值类型。

    在C++中,类和结构体其实没啥区别,结构体也可以封装、继承。类在不使用new申请创建对象的时候,也会在栈中为对象分配内存,并且不需要一个指针变量指向对象。所以类在本质上和结构体没有区别。要说区别,那唯一的区别就是:成员变量的默认访问权限:结构体是public的,类是private的。

    同时,类的结构体一样,数据成员要在内存中保持对齐的方式。

    new出来的所有的东西都放在堆上,new class、new struct甚至new一个int都会放到堆上,并且要在栈中有一个对应的指针变量指向堆中的这个对象。

    class A
    {
    private:
        int n;
    	int w;
    	int t;
    	double d;
    public:
        A(int _n, int _w, int _t, double _d )
        { }
        ~A(){}
    };
    
    int main()
    {
        A a(1,2,3,3.5);  //栈中分配
        A b = A(1,2,3,3.5);  //栈中分配
        A* c = new A(1,2,3,3.5);  //堆中分配
    
    	cout << sizeof(int) << endl;	//结果是4
    	cout << sizeof(double) << endl;	//结果是8
    	cout << sizeof(a) << endl;		//结果是24
    	cout << sizeof(c) << endl;		//结果是4
    	cout << sizeof(*c) << endl;		//结果是24
    
    	delete c;
        return 0;
    }
    

      

  • 相关阅读:
    [Vue音乐项目] 第六节 歌单列表
    [Vue音乐项目] 第五节 服务器代理跨域
    [Vue音乐项目] 第四节 轮播图
    [Vue音乐项目] 第三节 JSONP跨越
    [Vue音乐项目] 第二节 前提工作
    [Vue音乐项目] 第一节 环境搭建
    HTML网页页脚版权标志
    移动端页面隐藏滚动条
    FDD项目中的总结
    bootstrap模态窗字体模糊
  • 原文地址:https://www.cnblogs.com/stemon/p/4465798.html
Copyright © 2011-2022 走看看