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:要看灯的温度;