首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-07 
关于带形参默认值的构造函数,在用该类实例化对象时的构造函数调用问题小弟遇到一个问题,还请各位前辈不吝

关于带形参默认值的构造函数,在用该类实例化对象时的构造函数调用问题
小弟遇到一个问题,还请各位前辈不吝赐教
//**************************************  
// 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
1noname
create one student
2noname
----fn----
2
----析构----
destruct one student2
----析构----
destruct one student1
----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”


{  
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;


这段代码的输出结果是:
----fn----
0
----main----
0
上面这段代码再类中我定义了一个带形参的构造函数
student(char* pname="no name") 并给构造函数的形参赋了一个默认值“no name”
并在子函数void fn()中用下面这种方式实例化对象:
void fn()
{  
student s1();
student s2();
...

我想问的是:
在实例化对象时肯定会调用这个类的构造函数,可是根据输出结果可以看出在实例化对象时并没有调用调用student(char* pname="no name")这个我自定义的构造函数,但是通过我列出的 “student.cpp 例子2” 这段代码中可以知道如果我再类中自定义了一个构造函数的话那么编译器不提供默认构造函数
那么在最后“student.cpp 例子3” 这段代码中 编译器没提供默认的构造函数,我再类中自定义的构造函数又没被调用,那么他是怎么实例化对象的呢?

小弟初学,这个问题是偶然发现的。所以上来问问,希望路过的高人给一些指点。


[解决办法]
student s1(); 
student s2(); 

这样并不是调用构造函数,而是一个返回student 的函数S1()

换成
student s1; 
student s2;
[解决办法]
c++会找任何可以解释成函数的化码当成函数
连这样都行

C/C++ code
class c{public:    int i;};int main(){    c i(),j(int i);    c k = i();    c u = j(1);    //i.i = 1    return 0;} 

热点排行