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

  • 相关阅读:
    bzoj 2216 Lightning Conductor
    一些有趣的问题合集
    Codeforces 40E Number Table
    Codeforces 37D Lesson Timetable
    bzoj 4289 Tax
    bzoj 2844 albus就是要第一个出场
    bzoj 2115 Xor
    luogu 3790 文艺数学题
    bzoj 1420 Discrete Root
    Lucas定理学习笔记
  • 原文地址:https://www.cnblogs.com/fickleness/p/3148979.html
Copyright © 2011-2022 走看看