关于带形参默认值的构造函数,在用该类实例化对象时的构造函数调用有关问题

关于带形参默认值的构造函数,在用该类实例化对象时的构造函数调用问题
小弟遇到一个问题,还请各位前辈不吝赐教
//**************************************  
// student.cpp 例子1  
//**************************************  
#include <iostream.h>  
#include <string.h>  
class student
{  
public:
student(char* pname="no name") //给构造函数的参数赋了一个默认值“no name”
{  
char* name= new char[512];
cout<<"create one student"<<endl;  
strcpy(name,(const char *)pname);
number++;
cout<<number<<"\t"<<name<<endl; 
delete name;
}
~student()
{
cout<<"----析构----"<<endl;
cout<<"destruct one student"<<"\t"<<number--<<endl;
}
static int Num()
{  
return number;
}
protected:
static int number;
};
int student::number=0; 
void fn()
{  
student s1;
student s2;
cout<<"----fn----\n"<<student::Num()<<endl;
}  
void main()
{  
fn();  
cout<<"----main----"<<"\n"<<student::Num()<<endl;


这段代码我编译了,没错误
输出结果是:
create one student
1 noname
create one student
2 noname
----fn----
2
----析构----
destruct one student 2
----析构----
destruct one student 1
----main----
0
很显然在void fn()函数中实例化s1,s2这两个对象时是调用student(char* pname="no name")
这个构造函数,"no name"是形参char* pname的默认值。那请您再往下看
//**************************************  
// student.cpp 例子2  
//**************************************  
#include <iostream.h>  
#include <string.h>  
class student
{  
public:
student(char* pname) //这次我将构造函数的形参默认值“no name”去掉了
{  
char* name= new char[512];
cout<<"create one student"<<endl;  
strcpy(name,(const char *)pname);
number++;
cout<<number<<"\t"<<name<<endl; 
delete name;
}
~student()
{
cout<<"----析构----"<<endl;
cout<<"destruct one student"<<"\t"<<number--<<endl;
}
static int Num()
{  
return number;
}
protected:
static int number;
};
int student::number=0; 
void fn()
{  
student s1;
student s2;
cout<<"----fn----\n"<<student::Num()<<endl;
}  
void main()
{  
fn();  
cout<<"----main----"<<"\n"<<student::Num()<<endl;


student(char* pname) //这次我将构造函数的形参默认值“no name”去掉了
此时再编译时,编译器返回错误信息:
error C2512: 'student' : no appropriate default constructor available
说明在子函数void fn()中实例化的两个对象时的方式:
void fn()
{  
student s1;
student s2;
...

有误,可以改为:
void fn()
{  
student s1("test1");
student s2("test2");
...

这是因为在类student中我已经定义了构造函数student(char* ),那么编译器在编译的时候不会再提供默认的student()构造函数,也就是说在实例化对象的时候一定要带参数。
这段代码证明了如果我们在类中定义了构造函数,那么编译器将不提供默认的构造函数,而是改为由我们自己定义默认的构造函数。那请您看一下最后这段代码
 

  //**************************************  
  // student.cpp 例子3  
  //**************************************  
#include <iostream.h>  
#include <string.h>  
class student
{  
public:
student(char* pname="no name") //给构造函数的参数赋了一个默认值“no name”