zoukankan      html  css  js  c++  java
  • C++题目汇总

    说明一下++p 与 p++ 的区别。

    正确答案: B   你的答案: B (正确)

    没有区别
    ++p更好一些
    p++更好一些
    和编译器有关

    假设这样的一个例子:
    1
    2
    3
    int p = -1;
    int y = 0;
    y = p++ + ++P;
    先分析一下它的汇编代码(没有优化):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    subl    $40, %esp              ; 分配40字节  
    movl    $1, -16(%ebp)          ; 存储 p 
    movl    $0, -12(%ebp)          ; 存储 y  
    movl    -16(%ebp), %eax        ; 这3步执行 p++  
    leal    1(%eax), %edx  
    movl    %edx, -16(%ebp)  
    addl    $1, -16(%ebp)          ; 这2步执行 ++p 
    movl    -16(%ebp), %edx  
    addl    %eax, %edx             ; 相加操作  
    movl    %edx, -12(%ebp)        ; 结果写回 y  
    可以看出p++需要3步,++p需要2步,而且修改p的值是不一样的,看出++p的效率比p++的高。
    指针++和i++是类似的。
    因为i++在计算时,会用到中间变量存储,会占用更多的内存和时间。所以++i更好。
     
    如下程序:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include "stdio.h"
    class Base
    {
    public:
        Base()
        {
            Init();
        }
        virtual void Init()
        {
            printf("Base Init ");
        }
        void func()
        {
            printf("Base func ");
        }
    };
    class Derived: public Base
    {
    public:
        virtual void Init()
        {
            printf("Derived Init ");
        }
        void func()
        {
            printf("Derived func ");
        }
    };
     
    int main()
    {
        Derived d;
        ((Base *)&d)->func();
         
        return 0;
    }
    该程序的执行结果

    正确答案: B   你的答案: C (错误)

    Base Init				
    Derived func
    Base Init
    Base func
    Derived Init			
    Base func
    Derived Init
    Derived func
    在构造函数不要调用虚函数。在基类构造的时候,虚函数是非虚,不会走到派生类中,既是采用的静态绑定。显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不可以那么写程序,你这么写,编译器也不会报错。只是你如果这么写的话编译器不会给你调用子类的实现,而是还是调用基类的实现。
    在析构函数中也不要调用虚函数。在析构的时候会首先调用子类的析构函数,析构掉对象中的子类部分,然后在调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数,这是非常危险的。
    
    
  • 相关阅读:
    Geometry
    后缀数组dc3算法模版(待补)
    CodeForces 467D(267Div2-D)Fedor and Essay (排序+dfs)
    HDU 3572 Task Schedule (最大流)
    Acdream手速赛7
    hdu2732 Leapin' Lizards (网络流dinic)
    HDU 3549 Flow Problem (最大流ISAP)
    HDU 1532 Drainage Ditches (网络流)
    [容易]合并排序数组 II
    [容易]搜索插入位置
  • 原文地址:https://www.cnblogs.com/timesdaughter/p/6751760.html
Copyright © 2011-2022 走看看