pclint相关

1,类成员函数在重载时的默认参数问题:
class XA
{
public:
    virtual void f(int a = 1) = 0;
};


class XB : public XA
{
public:
    virtual void f(int a = 2) { std::cout << a << std::endl; }
};


    XA* p = new XB;
    p->f(); // 这里的输出为1
    delete p;


2,父类的析构函数不为virtual的问题:
class A
{
public:
    //A() { std::cout << "Create A" << std::endl;}
    //~A() { std::cout << "Destroy A" << std::endl; }
    virtual void f() = 0;
};


class B : public A
{
public:
    B() { std::cout << "Create B" << std::endl; }
    ~B() { std::cout << "Destroy B" << std::endl; }


    virtual void f() {}
};


    std::cout << "create b1" << std::endl;
    A* b1 = new B;


    std::cout << "create b2" << std::endl;
    B* b2 = new B;


    std::cout << "delete b1" << std::endl;
    delete b1; // According to the C++ standard,
    // the behaviour of this is undefined.
    // Usually, only ~A() is called though b1 is an instance
    // of class B because ~A() is not declared virtual. 
    
    std::cout << "delete b2" << std::endl;
    delete b2; // Calls destructors ~B() and ~A()


输出如下:
create b1
Create B
create b2
Create B
delete b1 // 注意这里!
delete b2
Destroy B


3,父类的析构函数为virtual时:
class A
{
public:
    //A() { std::cout << "Create A" << std::endl;}
    virtual ~A() { std::cout << "Destroy A" << std::endl; }
    virtual void f() = 0;
};


class B : public A
{
public:
    B() { std::cout << "Create B" << std::endl; }
    ~B() { std::cout << "Destroy B" << std::endl; }


    virtual void f() {}
};


输出如下:
create b1
Create B
create b2
Create B
delete b1
Destroy B
Destroy A
delete b2
Destroy B

Destroy A


4,默认构造函数时类对象的初始化
class CA
{
public:
    int _i;


    // 默认构造函数
};


    CA* a1 = new CA; // a1是未初始化的
    std::cout << "i1: " << a1->_i << std::endl;
    CA* a2 = new CA(); // a2是初始化过的
    std::cout << "i2: " << a2->_i << std::endl;
    CA a3; // a3是未初始化的
    std::cout << "i3: " << a3._i << std::endl;
    //CA a4(); // error
    //std::cout << "i: " << a4._i << std::endl;


    delete a1;
    delete a2;
输出如下:
    i1: -842150451
    i2: 0
    i3: -858993460


5,自己提供构造函数时类对象的初始化
class CB
{
public:
    int _i;


    CB() // 自己提供无参构造函数
    {
        std::cout << "CB()" << std::endl;
        _i = 100;
    }
};


    CB* b1 = new CB; // b1是未初始化的
    std::cout << "i1: " << b1->_i << std::endl;
    CB* b2 = new CB(); // b2是初始化过的
    std::cout << "i2: " << b2->_i << std::endl;
    CB b3; // b3是未初始化的
    std::cout << "i3: " << b3._i << std::endl;
    //CB b4(); // error
    //std::cout << "i: " << b4._i << std::endl;


    delete b1;
    delete b2;
输出如下:
    CB()
    i1: 100
    CB()
    i2: 100
    CB()
    i3: 100


6,自己提供有参构造函数时类对象的初始化

class CC
{
public:
    int _i;


    CC(int i) // 自己提供构造函数,但没有提供无参的构造函数
    {
        std::cout << "CC(int i)" << std::endl;
        _i = i;
    }
};


    //CC* c1 = new CC; // error,找不到默认(系统提供)或者无参的构造函数
    //std::cout << "i1: " << c1->_i << std::endl;
    //CC* c2 = new CC(); // error,找不到默认(系统提供)或者无参的构造函数
    //std::cout << "i2: " << c2->_i << std::endl;
    //CC c3; // error,找不到默认(系统提供)或者无参的构造函数
    //std::cout << "i3: " << c3._i << std::endl;
    //CC c4(); // error
    //std::cout << "i: " << c4._i << std::endl;
    CC* c5 = new CC(100); // 
    std::cout << "i: " << c5->_i << std::endl;
    CC c6(100); // 
    std::cout << "i: " << c6._i << std::endl;


    //delete c1;
    //delete c2;
    delete c5;

输出如下:

    CC(int i)
    i: 100
    CC(int i)
    i: 100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值