注册 登录
编程论坛 C++教室

c++类调用问题

ycd123 发布于 2010-10-11 10:22, 551 次点击
#include<vector>
#include<iostream>
using namespace std;

struct Exmpl{
    Exmpl(){cout<<"Exmpl()"<<endl;}

    Exmpl(const Exmpl&)
    {cout<<"Exmpl(const Exmpl&)"<<endl;}

    Exmpl& operator=(const Exmpl &rhe)
    {
        cout<<"operator=(const Exmpl&)"<<endl;
        return *this;
    }

    ~Exmpl()
    {cout<<"~Exmpl()"<<endl;}
};

void fun1(Exmpl obj)
{}

void fun2(Exmpl& obj)
{}

Exmpl fun3()
{   
    Exmpl obj;
    return obj;
}

int main()
{
    Exmpl eobj;
    fun1(eobj);
    fun2(eobj);
    eobj=fun3();

    Exmpl *p=new Exmpl;
    vector<Exmpl> evec(3);

    delete p;
    return 0;
}

输出的结果为:
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
operator=(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()

书上写有它们是怎样调用的,但是不明白为什么会这样调用,还有当使用完默认构造函数后不需要调用析构函数吗?谢谢啦
2 回复
#2
hahayezhe2010-10-11 10:43
你可以去看下 深度搜索C++面向对象模型 这本书
#3
tornador2010-10-11 11:48
首先是这样的,有一点你理解错了。“还有当使用完默认构造函数后不需要调用析构函数吗?”调用析构函数不是一调用构造函数就立即析构,如果是这样的话,建一个类有什么作用?是当执行完这个类的作用域的函数时才调用析构函数的。局部变量是当执行完局部函数后调用析构函数。
还有就是这段函数里面还有形参的传递的问题。包括:值传递与地址传递的区别。这也就是fun1与fun2的区别。第一个属于值传递,执行机制是在内存空间内再分配一个空间用来存放形参,将形参的值复制过去。所以会调用构造函数,当执行完函数时,就会调用析构函数,也就是我前面所说的。第二个是地址传递,不需要分配空间,直接使用主函数里的变量的地址来访问变量。
其他变量,像eobj属于主函数里面的变量,要执行完整个函数后才会调用析构函数。
其他就你自己去逐个分析吧。这也是学习编程的一种方法。
另外,告诉你一个小技巧:你可以通过调试来看到底是怎样的输出顺序。按F10键开始调试。
希望对你有所帮助。
1