首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C++对析构函数的误解(2)

C++对析构函数的误解(2)

这里不仅声明了一个对象指针,而且new了,这说明给这一对象指针分配一个内存空间,当然这就会调用构造函数了;咦,奇怪了,为什么不自动调用析构函数了,说明C++内部缺少这一机制,C++毫不客气的对你说:“你提醒我给一个对象分配空间,那也得麻烦你提醒我将它释放(delete)。于是便有:
int main()
{
    myclass * mc;
    mc = new myclass();
    delete mc;
    return 0;
}




执行结果:

所以如果是指针在new之后需要手动释放资源。在较大型的工程当中,资源的释放很重要,因为涉及的数据量比较多,稍有不慎,就会造成资源的浪费和泄露之类的问题,从现在起你就应该养成把握资源的好习惯。
  条款20:宁以pass-by-reference-to-const替换pass-by-value。——Scott Meyers
为什么要在这里说在函数当中使用“常引用”,固然它跟析构函数有很大的牵连。
  
class myclass
{
    public:
    myclass()
    {
        cout << "构造函数" << endl;
    }
    ~myclass()
    {
        cout << "析构函数" << endl;
    }
};

void function(myclass mc)
{
}

int main()
{
    myclass mc;
    function(mc);
    return 0;
}





执行结果:


结果很明朗,function函数内对myclass类的对象mc作了一次复制(浅复制而已)而造出了另一个对象,也就是函数内的对象副本;调用函数的时候,如果选择是传值调用,那么会有参数副本被复制到函数的栈区。
因为这里调用的myclass类默认的copy构造函数,而不是调用上面myclass类的构造函数,但我们都明白,无论是哪种,都了构造,都是需要花费时间的,先不管时间有多短;遇上析构函数那是必然的。再者,如果myclass类有n个父类,而它的父类又有几个参数需要构造析构,最后还需要层层析构(virtual析构函数《C++虚函数和纯虚函数(1)》)......那这个花费的时间可就不能四舍五入啦。
解决方法就是宁以pass-by-reference-to-const替换pass-by-value。我们这样:
  
class myclass
{
    public:
    myclass()
    {
        cout << "构造函数" << endl;
    }
    ~myclass()
    {
        cout << "析构函数" << endl;
    }
};

void function(const myclass &mc)
{
}

int main()
{
    myclass mc;
    function(mc);
    return 0;
}





结果让我们大吃一惊:
继承事业,薪火相传
返回列表