美文网首页
C++中New关键字和命名空间

C++中New关键字和命名空间

作者: nethanhan | 来源:发表于2017-10-14 10:22 被阅读0次

    动态内存分配

    • C++中的动态内存分配
      • C++中通过new关键字进行动态内存申请
      • C++中的动态内存申请是基于类型进行的
      • delete关键字用于内存释放

    变量申请:

    Type* pointer = new Type;
    
    // ....
    
    delete pointer;
    

    数组申请:

    Type* pointer = new Type[N];
    
    // ....
    
    delete[] pointer;
    

    举个栗子:

    #include <stdio.h>
    
    int main()
    {
        //这里申请了一个int类型的变量,并用p指向
        int* p = new int;
        
        *p = 5;
        *p = *p + 10;
        
        printf("p = %p\n", p);
        printf("*p = %d\n", *p);
        
        delete p;
        
        //这里申请了一个数组,数组包含10个int类型的变量
        //注意,这里是至少分配了40个字节,因为有可能会多分配
        p = new int[10];
        
        for(int i=0; i<10; i++)
        {
            p[i] = i + 1;
            
            printf("p[%d] = %d\n", i, p[i]);
        }
        
        delete[] p;
        
        return 0;
    }
    
    
    • new 关键字与 malloc 函数的区别

      • new关键字是C++的一部分
      • malloc是由C库提供的函数
      • new以具体类型为单位进行内存分配
      • malloc以字节为单位进行内存分配
      • new在申请单个类型变量时可进行初始化
      • malloc不具备内存初始化的特性
    • new 关键字的初始化

    //申请了一个int类型的变量,并初始化为1
    int* pi = new int(1);
    
    //申请了一个float类型的变量,并初始化为2.0f
    float* pf = new float(2.0f);
    
    //申请了一个char类型的变量,并初始化为c
    char* pc = new char('c');
    

    C++中的命名空间


    • 在C语言中只有一个全局作用域

      • C语言中所有的全局标识符共享同一个作用域
      • 标识符之间可能发生冲突
    • C++中提出了命名空间的概念

      • 命名空间将全局作用域分成不同的部分
      • 不同命名空间中的标识符可以同名而不会发生冲突
      • 命名空间可以相互嵌套
      • 全局作用域也叫默认命名空间
    • C++命名空间的定义

    namespace Name
    {
        nameSpace Internal
        {
            /*.........*/
        }
        
        /*........*/
    }
    
    • C++命名空间的使用:
      • 使用整个命名空间: using namespace name;
      • 使用命名空间中的变量: using name::variable;
      • 使用默认命名空间中的变量: ::variable

    例如:

    #include <stdio.h>
    
    namespace First
    {
        int i = 0;
    }
    
    namespace Second
    {
        int i = 1;
        
        //嵌套一个命名空间
        namespace Internal
        {
            struct P
            {
                int x;
                int y;
            };
        }
    }
    
    int main()
    {
        using namespace First;
        using Second::Internal::P;
        
        //这里的i是 First 命名空间下的i
        printf("First::i = %d\n", i);
        
        //这里直接使用 Second 命名空间下的i
        printf("Second::i = %d\n", Second::i);
        
        //这里的P 是Second命名空间中 嵌套的 Internal中的
        P p = {2, 3};
        
        printf("p.x = %d\n", p.x);
        printf("p.y = %d\n", p.y);
        
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:C++中New关键字和命名空间

          本文链接:https://www.haomeiwen.com/subject/osdxuxtx.html