48,C++(02)

来源:互联网 发布:淘宝联盟可以合并下单 编辑:程序博客网 时间:2024/06/07 22:56

/*
达内学习 C++ day46 2013-11-6
*/
一,c++发展
1983  正式命名
1987  GNU c++
1992   微软 ibm  c++
1998   c++98
2003    c++03
2011  c++0x
gcc **.cpp -std=c++0x;

二,第一个C++程序
  1,文件后缀 .c .cpp .cxx .C 推荐.cpp
  2, 标准C++没有.h头文件
      cstdio  cstring ctime
  3, 引入头文件  实际是对数据的声明
     using  namespace  std;
  4,编译器
      gcc  **.cpp -lstdc++
       g++ **.cpp
    -S 生成汇编   -O 优化  -g生成调试信息  -E预处理  -I 头文件位置  -l库的位置
三,命名空间
   1,命名空间的概念
    将一组相关的数据包装到一起,然后给这个包装的名字起一个逻辑名称。
   2,目的
    方便管理数据 防止命名冲突
   3,语法
     namespace -name{
         数据
     }
      空间中的数据 声明和实现 是可以分开的
   4,命名空间使用
   5,特殊的命名空间 匿名命名空间
      namespace{
      数据  
   }
   6,命名空间的嵌套
四,c++中的 结构 联合 枚举
  1,结构
    定义变量时可以不使用 struct
    结构体中可以定义函数
   c++中没有任何成员 结构体大小是1
  2,联合  
    定义变量时 可以不在使用 union
    支持匿名联合
    (大端序 小端序 for)
  3,枚举
   定义变量时候,可以不再使用 enum
   本质上是整数,所以枚举值可以赋值给int
   但是c++类型检查更严格,int 不能赋值给 enum
五,bool 类型
   c++ 作为一种特定的类型
   取值只有 true(1) false(0)
   赋值可以为任意值 只要不是  NULL 0 '\0' false 其他都是真
六,替换
七,c++中的函数
  1,无参的参数列表,严格匹配,void依然可以用
  2,c++函数  必须前置声明,不再支持隐式声明
  3,返回值不能省略  main函数除外
  4,c++中的函数重载
       a,什么是函数重载
             在同一作用域,函数名相同,参数列表不同,返回值任意叫重载(overload)
             参数列表不同是 参数个数 类型  顺序 不同都会是列表不同
       b,函数重载的原理 
          当编译生成代码时  函数调用名 会根据函数名和参数列表重新生成调用名。
       c,函数重载的好处
          对函数的实现者  函数的名字简单
          对函数的调用者  不用考虑类型 方便调用
       d,重载的引入带来的问题 和解决方案
          跨编译器调用 
           防止编译器改名 extern "C" int add(int a,int b)
          如果用c++ 实现一个函数需要在实现中加上一个extern "C" 然后提供供C调的 头文件
         如果c实现函数,需要给c++ 提供一个调用头文件 头文件中需要加一个 extern "C"
  5,哑元
     参数只有类型 没有形参名
     作用就是保持函数的向前兼容 区分函数
  6,参数默认值
    不传参默认,传参以后替代
    注:参数的默认值必须靠右   ;当函数的声明和实现分离时,参数默认值写在头文件中。
     不能和重载函数形成冲突。
     参数默认值的好处:简化传参
  7,内联函数
    宏函数 预处理时候完成替换
    内联函数 编译时完成替换
    inline  void test()
 内联只是一种请求  如果请求成功  则把代码粘贴过去 如果请求不成功则变成普通
   代码量大或者函数递归时候 不容易请求成功。
八,内存分配
    new  delete  申请单个内存
    new[]   delete[]    申请多个内存
    int*p = new int; 初值不保证是 0
    可以指定初始值   int* p =new int(0)
    释放内存 delete  p ; 注意释放以后要置 NULL
    /*  申请多个内存对象 */
    int *parr = new int[5];
     parr[0] = 9; parr[1] = 5;
    /*  释放内存 */
    delete[]  parr; //成对new[]  delete[]  必须带[]

    定位分配
     char data[100];
     int *parr = new(data)int[25]; 不用释放

九,c++中的引用
  1,什么是引用
      引用就是一个对象的别名
  2,如何定义引用
     int a = 100;
     int& b =a;  //引用必须初始化
  3, 引用一旦确定就不能修改
     char *const p;  //指针指向不能改变
      const char * p;//指针指向可以改变
  4,const 引用
    const int& ra =100;     //不加const不可以 后面是常量
  5,函数中 参数的值传递 和 引用传递
   设计一个函数 传入来两个整数参数 交换两个整数参数的值
   引用作为参数的目的  减少参数的赋值,达到函数内部修改外部数据的目的
  6,引用作为函数的返回值
     把函数的返回值 做左值,
     返回的引用一定要确保函数调用完成后  引用保持合法
    int& add(int& a,int b)
   {
     a+b;        
     return a;
   }
  
十,C++ 中的类型转换
  a,static_cast<类型>(变量名)
     在某个方向上可以做隐式类型转换
     void* pv;
     int* pa=&a;
     pv = pa;
     pa = static_cast<int*>(pv);
  b,动态转换  dynamic_cast<类型>(变量名)
    有继承关系 类型之间进行转换
  c,const_cast<类型>(变量)
    去掉const修饰的
     volatile const int a = 100; //volatile 每次用到从内存中取出
     int * pa = const_cast<int*>(&a);
     *pa = 1000;  //不加volatile 的话 不能修改成功
  d,重新解释
   reinterpret_cast<类型>(变量);
   允许任何类型之间进行转换,包括指针——整数   整数--地址

 十一,c++之父给c给c程序员的建议
    1,尽量少使用宏, 使用const enum去定义常量,使用inline 代替带参宏
    使用namespace 防止命名冲突
    2,变量随时用 随时去定义  以保证初始化
    3,尽量使用引用 代替指针
    4,尽量多的使用const 修饰(函数的参数是引用或者指针类型)
   5,c++使用string 代替c 字符数组和指针
    6,面向对象

 

原创粉丝点击