高质量c编程指南 之一

今天做了一份林锐先生出的关于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 代表两个字 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值