高质量c编程指南 之一

来源:互联网 发布:qq三国js技能 编辑:程序博客网 时间:2024/05/16 12:32

今天做了一份林锐先生出的关于c和c++的试卷 做完以后大受鼓舞 我居然还可以拿到这么多分, 足足30呀, 立马大发兴致,从头再看primer.

不看不知道,好多概念好多只是点都不清楚,以下是今天在公司整理的一些

 

类型转换分隐式类型转换,算术转换,强制类型转换 其中强制类型转换又分为新式和旧式 

隐式类型转换 发生在表达式赋值,函数参数传递,函数返回值 的过程中 在这些过程中表达式的右值,传递进的参数,函数的返回值 如果与表达式左值类型,函数形参类型,返回类型不一致 则由编译器自动发生转换.

算术转换发生在发生算术运算时 保证了二元操作符的的两个操作数转换为同一类型 为防止精度缺失 类型总是被提升为较宽的类型. 如char-> int 

强制类型转换 的四种类型 static_cast 执行编译器隐式执行的强制转换与原来的c强制转换几乎一样 const_cast 转换掉表达式的常量性 和volatileness性 dynamic_cast 运行时刻转换 用于基类和派生类之间的转换 主要是当无法修改基类的成员函数时,用该转换匹配抽象类中定义的成员函数 要先校验

reinterpret_cast ???对于操作数进行低层次的重新解释.显示的表现代码每个强制转换代表的危险等级.这句是什么意思呢?

从网上看到这么一段关于static_cast和reinterpret_cast 的解释static_cast在进行转换时,将对原类型和目的类型进行静态的检验,他只允许一些合理的转换,比如:将子类的指针转换为基类的指针,将整型转为字符型等。但是,它会拒绝一些转换,比如将整数转换为指针等  
   
  而reinterpret_cast允许任意的类型装换,包括将指针转换为整数,将整数转换为指针,以及将常量转换为非常量等其主要用途是用在函数指针上

以下是MORE EFFECTIVE C++ 的一段:

typedef   void   (*FuncPtr)();             //   FuncPtr   is   一个指向函数  
                                                                  //   的指针,该函数没有参数  
  //   返回值类型为void  
  FuncPtr   funcPtrArray[10];               //   funcPtrArray   是一个能容纳  
                                                                  //   10个FuncPtrs指针的数组  
  让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:  
  int   doSomething();  
  你不能不经过类型转换而直接去做,因为doSomething函数对于funcPtrArray数组来说有一个错误的类型。在FuncPtrArray数组里的函数返回值是void类型,而doSomething函数返回值是int类型。  
  funcPtrArray[0]   =   &doSomething;           //   错误!类型不匹配    
  reinterpret_cast可以让你迫使编译器以你的方法去看待它们:  
  funcPtrArray[0]   =                                       //   this   compiles  
      reinterpret_cast<FuncPtr>(&doSomething);  
  转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表示),在一些情况下这样的转换会产生不正确的结果(参见条款M31),所以你应该避免转换函数指针类型,除非你处于着背水一战和尖刀架喉的危急时刻。一把锋利的刀。一把非常锋利的刀。  

到现在为止没有用过,个人觉得用处也不是很大>


引用:引用必须被初始化为一个对象,一旦引用被定义他就不能指向其它对象, int *&p = pi; 其中p是一个指向指针的引用,对引用的任何操作都会对应到它所指向的对象,const 引用可以用不同的对象初始化 可以是常量 及其它可以转换的类型   对于非const引用 初始化的对象如果不能寻址 如常量,不同类型值? 则编译器需要产生一个临时对象引用指向该对象,用户不能访问它 一旦引用发生改变 改变的是临时对象的值 故只有const 引用才可以用常量或不同类型的值来初始化 一个引用初始化为一个const对象的地址 ??????????

int add(int x, int y)
{
    int temp;
    temp = x+y;
    return temp;
}

 

const 修饰符 有两种用法 如 const char *csrc  表示 csrc 是一个指向char 类型 被定义为常量的指针, const对象的地址只能赋给指向常量的指针,但是一个const指针可以用非常量的对象地址赋值.

另一种用法是 char *const cstr 表示的是一个指针它为常量但是其指向的对象并不为常量(一个常量地址它指向一个字符类型的对象) 较少用


sizeof 操作符 代表变量或类型名字节数.
int short 在32位机上代表一个字  long 代表 一个或两个字
char 代表一个字节
float一个字 double 代表两个字 

原创粉丝点击