C++基础学习-20120518

1---------
printf中的%f会自动转化成double

2---------
static_cast的应用
实际上static_cast真正用处并不在指针和引用上,而在基础类型和对象的转换上
static_cast < type-id > ( expression )
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。   
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;   
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。   
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。   
③把空指针转换成目标类型的空指针。   
④把任何类型的表达式转换成void类型。
static_cast不能转换掉expression的const、volatile、或者__unaligned属性
虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用。其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用;在方法中定义一个static变量,该变量在程序开始存在直到程序结束;类中定义一个static成员,该成员随类的第一个对象出现时出现,并且可以被该类的所有对象所使用。

对static限定的改变必然会造成范围性的影响,而const限定的只是变量或对象自身。但无论是哪一个限定,它们都是在变量一出生(完成编译的时候)就决定了变量的特性,所以实际上都是不容许改变的。这点在const_cast那部分就已经有体现出来。


static_cast和reinterpret_cast一样,在面对const的时候都无能为力:两者都不能去除const限定。两者也存在的很多的不同,比如static_cast不仅可以用在指针和引用上,还可以用在基础数据和对象上;前面提到过reinterpret_cast可以用在"没有关系"的类型之间,而用static_cast来处理的转换就需要两者具有"一定的关系"了。

3-----------reinterpret_cast
MSDN的Visual C++ Developer Center 给出了它的使用价值:用来辅助哈希函数
操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。
int *n= new int ;   
double *d=reinterpret_cast<double*> (n);   
在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。   
因此, 需要谨慎使用 reinterpret_cast.

4-------const_cast  用法:const_cast<type_id> (expression)   
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。   一、常量指针被转化成非常量指针,并且仍然指向原来的对象;   
二、常量引用被转换成非常量引用,并且仍然指向原来的对象;   
三、常量对象被转换成非常量对象。


5------------dynamic_cast
 dynamic_cast < type-id > ( expression )
该运算符把expression转换成type-id类型的对象。
Type-id必须是类的指针、类的引用或者void*;   
如果type-id是类指针类型,那么expression也必须是一个指针,
如果type-id是一个引用,那么expression也必须是一个引用。   
dynamic_cast运算符可以在执行期决定真正的类型。
如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。   
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。   
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;   
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

b是基类,d是派生类,pb指向基类对象的指针
D *pd1 = static_cast<D *>(pb);   把基类的指针转化成派生类使用,是不安全的
D *pd2 = dynamic_cast<D *>(pb); 这时返回值将是一个空指针
他不是强制转换,是一种带有咨询性质的,如果不成功返回null


6---------多态
B b;
A* a=&b;
 简单的说,建立一个父类的对象,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。


7------------如何从键盘输入一组数据,让一个数组来接收???
int str[11];
for(int i=0;i<10;i++)
{cin<<str[i]<<endl;}//可以指定输入的数据的个数

1:写一个函数求得数组中的每个元素除以第一个元素的结果;
int fun(int *arr,int size)
{
for(int i=size-1;i>=0;i--)
if(arr[0])
arr[i]/=arr[0];
}
注意点:1:循环正着写会使第一次得到的arr[0]=1,成为下一个的被除数
2:检查被除数是否为0

2:会议室三盏灯,分别有三个开关控制,只有进入房间才能知道哪个灯是亮的,只允许进入房间一次,如何判断那个开关控制那个灯?
tips:要看灯的温度;

posted @ 2013-06-21 20:53  夜雨阑珊  阅读(192)  评论(0编辑  收藏  举报