缺省参数的构造函数
一、对于带参数的构造函数,在定义对象时必须给构造函数传递参数,否则构造函数将不被执行。
但是在实际应用中,有些构造函数的参数值通常是不变的,只有在特殊情况下才需要改变它的参数值,这时可以定义成带缺省参数的构造函数。
示例:
class Stu
{
private:
char *name,*stu_no;
float score;
public:
Stu(char *name1,char *stu_no1,float score1);
~Stu();
void modify(float score1);
void show();
void Show_One(int n);
};
Stu::Stu(char *name1="Mr.all",char *stu_no1="123456",float score1=100.0)
{
name=new char[N];
strcpy(name,name1);
stu_no=new char[N];
strcpy(stu_no,stu_no1);
score=score1;
}
Stu a("Mr.zhang","1206655023",150);
Stu b("Mr.zhou","1206655022");
Stu c("Mr.wu");Stu d;
缺省的构造函数
一、编译系统自动生成的缺省的构造函数。
在实际的应用中,一般都是需要构造函数的。 如果没有给类定义构造函数,则编译会自动生成一个缺省的构造函数。
格式: 类名::缺省构造函数名() { }
示例:
//类 Date中没有自定义构造函数.
Date date1,date2;
//编译系统会自动生成下述的构造函数
Date::Date() { }
它的作用:只是为对象开辟一个存储空间,而不能给对象中的数据成员赋初始值。
Ps:
第一,对于没有定义构造函数的类,其公有数据成员可以用初始值表进行初始化。(常用于结构和数组的初始化)
示例:
#include<iostream>
using namespace std;
class A
{
public:
int a,b;
};
int main()
{
A s={1,2};
//这是的A类数据成员的公有的.所以类外是可以访问的.
/*s.a=1;
s.b=2;*/
cout<<s.a<<' '<<s.b<<endl;
return 0;
}
第二、与定义变量类似,在用缺省的构造函数创建对象是,如果创建的是全局对象或静态对象,则对象的所有数据成员初始化为0或者空,否则对象的数据成员值的随机的。
示例1:(公有数据成员)
#include<iostream>
using namespace std;
const int N=20;
class A
{
public:
char name[N];
int no;
} a;
int main()
{
cout<<a.name<<a.no<<endl;
A b;
cout<<b.name<<b.no<<endl;
return 0;
}
示例2 :(私有数据成员)
#include<iostream>
using namespace std;
const int N=20;
class A
{
private:
char name[N];
int no;
public:
void Get()
{cout<<name<<no<<endl;}
} a;
int main()
{
a.Get();
A b;
b.Get();
return 0;
}
第三,只要一个类定义了一个构造函数(不一定的无参构造函数),系统将不在提供缺省的构造函数。
缺省的析构函数
一、每个类必须有一个析构函数。如果没有显式地为一个类定义析构函数。编译系统会自动生成一个缺省的析构函数。
格式:类名::~析构函数名() { }
示例:
//类 Date没有显式的定义析构函数
Date::~Date()
{ }
二、对于大多数的类,缺省的析构函数就能满足要求。但是,如果在一个对象完成其操作之前需要做一些内部处理,则应该显式地定义析构函数。