C++面向对象的一些问题

来源:百度知道 编辑:UC知道 时间:2024/06/15 01:56:02
1.类外定义构造函数如何说明?我的程序在VC++下编译不通过,但是若把类外构造函数复制粘贴为类内构造函数,编译通过。为什么?请高手指教。
#include<iostream.h>
class Date
{
private:
int Year,Month,Day;
public:
Date(int,int,int);
void ShowDate()
{
cout<<Year<<'.'<<Month<<'.'<<Day<<endl;
}
};
Date::Date(int y=2003,int m=1,int d=1)
{
Year=y;
Month=m;
Day=d;
}
main()
{
Date d1,d2(2008),d3(2008,11),d4(2008,11,19);
d1.ShowDate();
d2.ShowDate();
d3.ShowDate();
d4.ShowDate();
}

2.当定义了char a[10],*p以后,若p用new申请了一段动态空间,那么需要析构函数?但是为什么a[10]不需要析构函数释放空间吗?
3.析构函数的函数体程序是需要进行设计来达到释放空间的目的还是即使函数体为空也能自动释放空间?

一个问题20分。。。

1.默认参数只在声明时指定,定义时用一般形式
2 动态空间有两种,堆和栈,用new申请的在堆中,需要自己显式调用delete 或free释放,在栈中的当函数执行完时自动释放。可以说基本类型如char int是没有构造函数析构函数的,类如date才有,析构函数做的就是释放空间,如果有new申请的动态空间,会在析构里通过delete释放。所以你的问题确切的说应该是 .当定义了char a[10],*p以后,若p用new申请了一段动态空间,那么需要 释放而不是 析构,而比如 int a[10]={1,2}则是在栈中的,函数执行完会自动释放
3c++中 会自动生成 构造 复制构造 析构 赋值四种函数,若申请了堆空间,最好自己再实现下析构的函数体

第一个 你这样定义个人觉得没有问题

第二个 只有new malloc 申请的空间 才需要手动释放 因为 要不然这段空间一直被占有 ,而char a[10] 这样的数据 有他们的生存周期 比如局部函数中,当跳出局部函数时,系统自动撤销, 但是如果局部函数中new了一段空间, 当跳出局部函数后,系统并不对他撤销 所以必须自己设定析构函数或其它撤销方法

第三个 当没有new 时, 所有的空间会被撤销 但有new的话 必须在析构函数中free下 才可以达到目的

1.首先要说明的是,VC++要求main() 前面有void定义,不过你的不是这个问题,先告诉你
你的Date(int,int,int); 声明是有问题的,你想形参缺省,必须在这里定义
Date(int y=2003,int m=1,int d=1); 然后在类外构造函数时,
Date::Date(int y,int m,int d)
{
Year=y;
Month=m;
Day=d;
}

不会有问题的,我已经试过,成功的

2.你的第二个问题问的好乱。。new申请类会自动调用构造函数,当delete时会自动调用析构函数;char a[10]是什么???它不是类就没有什么构造函数的概念

3.析构函数一般需要手动设计,但是即使你不设