来源:远方网络 | 2006-1-6 | (有2076人读过)
构造函数可以带任意多个的形式参数,这一点和普通函数的特性是一样的!
下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。
代码如下:
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> using namespace std; class Teacher { public: Teacher(char *input_name)//有参数的构造函数 { name=new char[10]; //name=input_name;//这样赋值是错误的 strcpy(name,input_name); } void show();
protected: char *name;
};
void Teacher::show() { cout<<name<<endl; }
void main() { //Teacher a;//这里是错误的,因为没有无参数的构造函数 Teacher a("test"); a.show(); cin.get(); }
我们创建了一个带有字符指针的带有形参的Teacher(char *input_name)的构造函数,调用它创建对象的使用类名加对象名称加扩号和扩号内参数的方式调用,这和调用函数有点类似,但意义也有所不同,因为构造函数是为创建对象而设立的,这里的意义不单纯是调用函数,而是创建一个类对象。
一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码
Teacher a;
就是错误的!!!
这里还有一处也要注意:
//name=input_name;//这样赋值是错误的
因为name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete释放堆空间出错!(析构函数的内容我们后面将要介绍)
如果需要调用能够执行就需要再添加一个没有参数的构造函数
对上面的代码改造如下:
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> using namespace std; class Teacher { public: Teacher(char *input_name) { name=new char[10]; //name=input_name;//这样赋值是错误的 strcpy(name,input_name); } Teacher()//无参数构造函数,进行函数重载 {
} void show();
protected: char *name;
};
void Teacher::show() { cout<<name<<endl; }
void main() { Teacher test; Teacher a("test"); a.show(); cin.get(); }
创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类添加任意多个构造函数,来使用不同的参数来进行初始话对象!
|