4、C++中新的关键字

来源:互联网 发布:linux 启动service 编辑:程序博客网 时间:2024/06/05 16:11
1、C++中的动态内存分配
     C++中通过new关键字进行动态内存申请
     C++中的动态内存申请是基于类型进行的
     delete关键字用于内存释放
     
     变量申请:
     Type* pointer = new Type;
     //......
     delete pointer;
     
     数组申请:
     Type* pointer = new Type[N];
     //......
     delete [] pointer ;
     
2、new关键字与malloc函数的区别
    ·new关键字是C++的一部分,malloc是由C库提供的函数
    ·new以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配
    ·new在申请单个类型变量时可进行初始化,malloc不具备内存初始化的特性
    
3、C++中的命名空间
     在C语言中只有一个全局作用域
         C语言中所有的全局标识符共享通一个作用域
             标识符之间可能发生冲突
             
     C++中提出了命名空间的概念
       ·命名空间将全局作用域分成不同的部分
       ·不同命名空间中的标识符可以同名而不会发生冲突
       ·命名空间可以相互嵌套
       ·全局作用域也叫默认命名空间

4、C++命名空间的使用:
    ·使用整个命名空间:using namespace name;
    ·使用命名空间中的变量:using name::variable;
    ·使用默认命名空间中的变量:::varible;
    
    默认情况下可以直接使用默认命名空间中的所有标识符
    
5、强制类型转换
   ·C方式强制类型转换存在的问题
      过于粗暴
          任意类型之间都可以进行转换,编译器很难判断其正确性
      难于定位
          在源码中无法快速定位所有使用强制类型转换的语句
          
   在程序设计理论中强制类型转化是不被推荐的,与goto语句一样,应该尽量避免
   
6、C++将强制类型转换分为4种不同的类型
     static_cast    const_cast
     dynamic_cast   reinterpret_cast
     
     用法:XXX_cast<Type>(Expression)
     
7、static_cast强制类型转换
   ——用于基本类型间的转换,但不能用于基本类型指针间的转换
   ——用于有继承关系类对象之间的转换和类指针之间的转换
   
      int main()
      {
          int i = 0;
          char c = 'c';
          int *pi = &i;
          char *pc = &c;
          
          c = static_cast<char>(i);  //It's ok!
          pc = static_cast<char *>(pi);//  GG!
          
          return 0;
      }
      
   static_cast是编译期进行转换的,无法在运行时检测类型,
   所以类类型之间的转换可能存在风险。
   
8、const_cast强制类型转换
       ——用于去除变量的const属性
           int main()
           {
               const int& j = 1;
               int& k = const_cast<int&>(j);
               const int x = 2;
               int& y = const_cast<int&>(x);
               
               k = 5;
               
               printf ("j = %d\n", j);
               printf ("k = %d\n", k);
               
               y = 3;
               
               printf ("x = %d\n", x);
               printf ("y = %d\n", y);
               printf ("&x = %p\n", &x);
               printf ("&y = %p\n", &y);
               
               return 0;
           }
           
9、reinterpret_cast强制类型转换
  ——用于指针类型间的强制类型转换
  ——用于整数和指针类型间的强制转换
      typedef void(PF)(int);
      
      int main()
      {
          int i = 0;
          char c = 'c';
          int *pi = reinterpret_cast<int*>(&c);
          char *pc = reinterpret_cast<char *>(&i);
          PF* pf = reinterpret_cast<PF*>(0x12345678);
          
          c = reinterpret_cast<char>(i);// Oops,static_cast should be used here.
          return 0;
      }  
      
10、dynamic_cast强制类型转换
  ——主要用于类层次间的转换,还可以用于类之间的交叉转换
  ——dynamic_cast具有类型检查的功能,比static_cast更安全
 
11、小结
   ·C++中内置了动态内存分配的专用关键字
   ·C++中的动态内存分配是基于类型进行的
   ·C++中的命名空间概念用于解决名称冲突问题
   ·C++细化了C语言中强制类型转换的方式
      ——C++不推荐在程序中使用强制类型转换
      ——C++建议在强制类型转换时考虑一下究竟希望什么样的转换
0 0
原创粉丝点击