zoukankan      html  css  js  c++  java
  • cppPrimer学习19th

    cppPrimer学习19th

    19.3

    已知存在如下的类继承体系,其中每个类分别定义了一个公有的默认构造函数和一个析构函数:
    class A { /* ... */};
    class B : public A { /* ... */};
    class C : public B { /* ... */};
    class D : public B, public A { /* ... */};
    下面哪个 dynamic_cast 将失败?
        
    (a) A *pa = new C;
    	B *pb = dynamic_cast<B*>(pa);		ok
    (b) B *pb = new B;
    	C *pc = dynamic_cast<C*>(pb);		错误,内存本身就是基类的
    (c) A *pa = new D;						D里面有两个A,无法转换
    	B *pb = dynamic_cast<B*>(pa);
    

    19.4

    使用上一个练习定义的类改写下面的代码,将表达式*pa 转换成类型C&:
    if (C *pc = dynamic_cast<C*>(pa))
    {
    	//使用C的成员
    	pc->....
    	
    } else {
    	//使用A的成员
    	pa->...
    }
    
    A *pa = new C;
    ..接下去就正常使用了 
    
    

    19.5

    在什么情况下你应该用 dynamic_cast 替代虚函数?
    基类的指针,但是实际内存是子类的,并且没有虚函数
    

    19.6

    编写一条表达式将 Query_base 指针动态转换为 AndQuery 指针。
    分别使用 AndQuery 的对象以及其他类型的对象测试转换是否有效。
    打印一条表示类型转换是否成功的信息,确保实际输出的结果与期望的一致
    
    https://blog.csdn.net/shamozhizhoutx/article/details/90490237
    

    19.8

    if(typeid(*pa1) == typeid(*pa2))
    

    19.9

    // 编写与本节最后一个程序类似的代码,令其打印你的编译器为一些常见类型所起的名字。如果你得到的输出结果与本书类似,尝试编写一个函数将这些字符串翻译成人们更容易读懂的形式。
    

    19.10

    //已知存在如下的类继承体系,其中每个类定义了一个默认公有的构造函数和一个虚析构函数。
    //    下面的语句将打印哪些类型名字?
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    class A
    {
    };
    class B : public A
    {
    };
    class C : public B
    {
    };
    
    int main(int argc, char const *argv[])
    {
        {
            A *pa = new C; //A类型指针 P1A
            cout << typeid(pa).name() << endl;
        }
        {
            C cobj;
            A &ra = cobj;
            cout << typeid(&ra).name() << endl; //A类型指针 P1A
        }
        {
            B *px = new B;
            A &ra = *px;
            cout << typeid(ra).name() << endl; // A类型 1A 
        }
    
        while (1)
            ;
        return 0;
    }
    
    

    19.11

    普通的数据指针和指向数据成员的指针有何区别?
    
    普通的数据指针指向对象
    成员指针指向非静态类成员,初始化指针是只是指向成员,在使用时指定对象,
    	同时定义时需要 提供类名 classname::*pt
    
    
    

    19.12

    定义一个成员指针,令其可以指向 Screen 类的 cursor 成员。通过该指针获得 Screen::cursor 的值。
    
    pos cursor = 0;
    
    public:
    	Screen::pos Screen::*getpos(){
    		return &Screen::cursor; 
    	}
    	
    main
    {
        Screen myScreen(2, 2, 'c'); 
        const Screen::pos Screen::*pcursor = Screen::pcursor();
        auto i = myScreen.*pcursor;
    }
    
    
    

    19.14

    下面的代码合法吗?如果合法,代码的含义是什么?如果不合法,解释原因。
    
    auto pmf = &Screen::get_cursor;
    pmf = &Screen::get;   // 两个函数返回值不一样
    

    19.15

    普通函数指针和指向成员函数的指针有何区别?
    
    1.在成员函数和指向该成员的指针之间不存在自动转换规则  函数名不能直接赋值,要使用 &classname::fun;
    2.使用的时候才指定具体对象
    

    19.16

    声明一个类型别名,令其作为指向 Sales_data 的 avg_price 成员的指针的同义词。
    using AvgPrice = double (Sales_data::*)() const;
    AvgPrice avgprice = &Sales_data::avg_price;
    

    19.17

    为 Screen 的所有成员函数类型各定义一个类型别名。
    略 https://blog.csdn.net/shamozhizhoutx/article/details/90490237
    

    19.18

    编写一个函数,使用 count_if 统计在给定的 vector 中有多少个空 string。
    
    std::function<bool (const std::string&)> fcn = &std::string::empty;
    std::count_if(vs.begin(), vs.end(), fcn)
    

    Tudo 嵌套类 联合体 内部类

  • 相关阅读:
    筛选法 || POJ 1356 Prime Land
    搜索 || BFS || POJ 3278 Catch That Cow
    (素数筛) 找质数
    (map)后缀字符串
    字符串的进制
    (二进制枚举子集)买玩具
    (基础)01背包问题
    (基础)编辑距离
    (基础)最长公共字串
    最大子矩阵和
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/12822020.html
Copyright © 2011-2022 走看看