4. C++中new、namespace

1. C++ 动态内存分配

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

变量申请:
Type* pointer = new Type;
变量释放:
delete pointer;

数组申请:
Type* pointer = new Type[N];
变量释放:
delete[] pointer;

#include 

int main()
{
    int* p = new int;
    
    *p = 5;
    *p = *p + 10;
    
    printf("p = %p\n", p);
    printf("*p = %d\n", *p);
    
    delete p;
    
    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;
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

❖new关键字与malloc函数的区别

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

❖new关键字的初始化

#include 

int main()
{
    int* pi = new int(1);               //动态分配一个int空间给pi,并赋值为1
    float* pf = new float(2.0f);        //2.0后面加f,表示2.0是个float类型
    char* pc = new char('c');
    
    printf("*pi = %d\n", *pi);
    printf("*pf = %f\n", *pf);
    printf("*pc = %c\n", *pc);
    
    delete pi;
    delete pf;
    delete pc;
    
    printf("Press any key to continue...");
    getchar();
    return 0;
}

2. C++ 命名空间

❖在C语言中只有一个全局作用域
      ▪ C语言中所有的全局标识符共享同一个作用域
      ▪ 标识符之间可能发生冲突
❖C++中提出了命名空间的概念
      命名空间将全局作用域分成不同的部分
      不同命名空间中的标识符可以同名而不会发生冲突
      命名空间可以相互嵌套
      全局作用域也叫默认命名空间

❖C++命名空间的定义:

namespace name { /* … */ }

#include 

namespace First
{
    int i = 0;
}

namespace Second
{
    int i = 1;
    
    namespace Internal
    {
        struct P
        {
            int x;
            int y;
        };
    }
}

int main()
{
    using namespace First;             //使用First整个命名空间,成为该main()的默认空间
    using Second::Internal::Position; //使用Second->Internal空间里的Position结构体

    printf("First::i = %d\n", i);    

    printf("Second::i = %d\n", Second::i);
    
    Position p = {2, 3};  
    printf("p.x = %d\n", p.x);
    printf("p.y = %d\n", p.y);

    return 0;
}

❖C++命名空间的使用:
❖使用整个命名空间:using namespace name;
❖使用命名空间中的变量:using name::variable;
❖使用默认命名空间中的变量:::variable
默认情况下可以直接使用默认命名空间中的所有标识符。



在现代的软件产品中有三个大问题是BUG的源泉:

  1. 运算符的优先级;
  2. 多线程编程时各个模块间的交互;
  3. 强制类型转换

你可能感兴趣的:(4. C++中new、namespace)