zoukankan      html  css  js  c++  java
  • 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:要看灯的温度;

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
  • 原文地址:https://www.cnblogs.com/fickleness/p/3148979.html
Copyright © 2011-2022 走看看