C++构造函数初探
C++构造函数的功能是在创建对象时,用给定的值对对象进行初始化。构造函数是成员函数,他有成员函数的共性,他是特使的成员函数,拥有自己的特性:该函数名与类名相同,不指定返回值类型,他有隐含的返回值,该值由系统内部使用。
一、构造函数形式
class Person { public: Person(){ ........ ........ } private: int nage; }
二、构造函数分类
1、系统默认
class Person { public: private: int nage; }
在类中没有自己定义构造函数的时候,系统会默认调用一个无参构造函数,这个构造函数是一个空函数,相当于:
Person(){ }
2、无参构造函数
class Person { public: Person(){ nage = 10; ........ } private: int nage; ........ }
无参构造函数会在创建对象时,用指定的值对对象的成员变量进行初始化,因为没有参数传入,所以初始化值是在程序设计时就已经确定的,在对象创建时无法改变,灵活性比较差。
3、带参数的构造函数---又称为 重载构造函数
class Person { public: Person( int x,........){ nage = x; ........ } private: int nage; ........ }
重载构造函数同样是在对象创建时,用传入的指定参数对成员变量进行初始化,这种初始化的方式比较灵活。构造函数可以像普通成员函数一样重载,显而易见构造函数不会局限于一个,当对象在创建时,会根据传入参数的类型,数量,顺序调用匹配的构造函数,对对象成员变量进行初始化。
4、复制构造函数
class Person { public: Person(Person &x){ this->strname = x.nage; this->nage = x.nage; ........ } private: int nage; ........ }
复制构造函数是用一个已知的对象来创建一个新对象,新对象和已知对象数据成员的值可以相同,也可以不同的。在没有定义复制构造函数时,系统同样会为类提供一个默认的构造函数,在这种情况下,两个对象的数据成员值完全一样。
复制构造函数在以下三种情况中必须被调用:
a)、明确表示由一个对象来初始化另外一个对象;//Person per2(per1);
b)、当对象作为函数实参传递给函数形参的时候; //fun(per);
c)、当一个自动存储类对象作为函数返回值的时候;//return per;
示例:
#include <iostream> #include <string> using namespace std; class Person { public: string strname; int nage; //构造函数 //无参数构造函数 Person(){ } //有参构造函数 Person(string name){ strname = name; } Person(string name,int age){ strname = name; nage = age; } //复制构造函数 Person(Person &x){ this->strname = x.strname; this->nage = x.nage; } } void main(){ Person per;//调用无参构造函数 Person per1("xiaozhang",10);//调用有参构造函数 Person per2(per1);//调用复制构造函数 Person per3 = per2;//调用复制构造函数 }
三、子类显示调用父类构造方法
示例:
#include <string> #include <iostream> using namespace std; class Person{ public: string strname; int nage; Person(string name, int age):strname(name),nage(age){ // this->strname = name; // this->nage = age; } }; class Student : public Person{ public: int nnum; Student(string name, int age,int num):nnum(num),Person(name,age){ // this->nnum = num; } }; void main(){ Student stu("xiaozhang",19,22); }
在子类初始化中有两种形式,一种是在子类中直接对每个数据成员赋值(包括继承父类的数据成员),另一种方法是通过在子类的构造方法后面加:父类名(参数表)来调用父类构造方法,从而对子类对象进行初始化。