回 帖 发 新 帖 刷新版面

主题:析构函数的用法

#include<iostream>
#include<string>
using namespace std;
class Document
{
      string Name;
      int Size;
 public:
        Document(string,int){string Name=0, Size=0;}
        
        ~Document(){};
        void SetName(string);
        string GetName(){return Name;}
        int SetSize(int size){Size=size;}
        int GetSize(){return Size;}
        void PrintDocumentInfo()
        {
             cout<<"文档名:"<<Name<<'\n'<<"字数:"<<Size<<endl;
             
             }
};
int main()
{
    Document doc2("c++教程",189);
    doc2.PrintDocumentInfo();
    system("pause");
    return 0;
    
}
编译通过了,可运行时,却出现问题,估计是析构函数用错了,可却不知道要怎么改,求高手帮忙,在此先谢过

回复列表 (共8个回复)

沙发

先看看你的构造函数,再说析构函数吧。

板凳

[quote]先看看你的构造函数,再说析构函数吧。[/quote]
从他的代码水平上看,估计他看不出 string Name=0 是什么含义

3 楼


好吧,可以帮我小小解释吗。。。

4 楼


那是什么意思呢

5 楼


这不是赋初始值的意思吗

6 楼

个人觉得楼主应该看的不仅仅是构造函数,C语言的“函数”也得重新看看啊。

构造函数也是一个“函数”,它的参数表、函数体,一样需要按普通函数来写~~~~

7 楼

[quote]个人觉得楼主应该看的不仅仅是构造函数,C语言的“函数”也得重新看看啊。

构造函数也是一个“函数”,它的参数表、函数体,一样需要按普通函数来写~~~~[/quote]
谢谢呀,我会努力的

8 楼

呵呵,不客气:)
关于那个构造函数,楼主可以这样理解:
它首先得是一个函数,那么函数的参数列表既然要用,那就要把形参写出来:
于是函数头就应该是像这样的:
[Code=C]Document(string pmName,int pmSize)[/code]
并且,既然是“构造”函数,那函数名与类名必须一样,且不能对函数有“返回值声名”,这点满足。
再然后,函数里需要初始化的变量是在函数的“上级”,也就是函数主体的大括号外声名的变量,那就不需要再重声名了,所以函数体改为:
[Code=C]{Name=0, Size=0;}[/code]
接下来,初始化两个变量应该是两句话、两个完全无关的步骤,所以代码再改为:
[Code=C]{Name=0; Size=0;}[/code]
后来,我们发现应该用传入的参数来初始化变量,所以代码需要再改进改进以满足我们的需要,故:
[Code=C]{Name=pmName; Size=pmSize;}[/code]
最后,我们感觉代码写一行不漂亮,所以我们格式化一下代码:
[Code=C]
{
    Name=pmName;
    Size=pmSize;
}[/code]
最后,加上函数头我们就可以看到完整的、正确的构造函数了:
[Code=C]Document(string pmName,int pmSize)
{
    Name=pmName;
    Size=pmSize;
}[/code]

当然,正确不是最终的,在正确的前提下,我们还需要做“优化”。像上面的代码就仍需要进行改进!因为这里有一个值传递的string对象,虽然部分STL库中对string的优化已经相当优秀,但我们仍然是要养成好的习惯,像这样的对象我们应该使用引用或常量引用。
末了,我们可以得到优化后版本:
[Code=C]Document(const string &pmName, const int pmSize)
{
    Name=pmName;
    Size=pmSize;
}[/code]

我来回复

您尚未登录,请登录后再回复。点此登录或注册