zoukankan      html  css  js  c++  java
  • 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++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会 分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多
  • 相关阅读:
    人脸识别最新开发经验demo分享
    虹软人脸识别SDK的接入方法
    基于虹软sdk,java实现人脸识别(demo)
    【C#】 基于ArcFace 2.0—视频人脸识别Demo
    基于免费人脸识别的闸机开发及源码分享
    运算符及其应用
    vim 命令
    children lastchild parentNode parentElement
    同步对象锁有效作用域
    在eclipse导入Java 的jar包的方法 JDBC【图文说明】
  • 原文地址:https://www.cnblogs.com/lizhenlin/p/6813455.html
Copyright © 2011-2022 走看看