构造函数
一、定义:每个类都分别定义了它的对象被初始化的方式。类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数就叫构造函数。(构造函数的任务就是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。)
【注】:如果类的设计者没有写构造函数,那么编译器会自动生成一个没有参数的构造函数。
二、格式(函数名与类名一样,没有返回值)
例:
Class Complex{
private:
double real,iamg;
public:
Complex(double r, double i=0){
real=r; iamg=i;
};
三、举例说明
1、
Class Complex{
private:
double real,iamg;
public:
void Set(double t,double i);
};
这个Complex类代表复数,没有写构造函数,因此编译器会为Complex类自动生成一个无参的构造函数。下面语句定义或动态生成Complex对象的语句:
Complex c;//c用无参构造函数进行初始化
Complex * p=new Complex;//对象* p用无参构造函数初始化
2、如果为Complex类编写构造函数
Class Complex{
private:
double real,iamg;
public:
Complex(double r, double i=0){
real=r; iamg=i;
};
对下列语句进行编译
(1).Complex c1;//错,Complex类没有无参构造函数(默认构造函数)
(2).Complex& pc=new Complex;//错,.Complex类没有无参构造函数
(3).Complex c2(2);//正确,相当于Complex c2(2,0)
(4).Complex c3(2,4),c4(3,5);//正确
(5).Complex& pc2=new Complex(3,4);//正确
四、构造函数在数组中的使用
具体哪些元素用哪些构造函数进行初始化,取决于定义数组时的写法。
五、复制构造函数(拷贝构造函数)
1、什么叫拷贝构造函数:a、需要一个蓝本。b、是一个构造函数
2、拷贝构造函数是一个特殊的构造函数,名字与类名一致,它的参数是本类型的一个常引用变量。Complex(const Complex & c);
3、什么时候用拷贝构造函数
- 当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用。例:T a(b);
- 如果F的参数是类A的对象,那么当F被调用时,类A的复制构造函数将被调用。
class A {
public:
A (){};
A(A& a){
cout<<"holle"<<endl;
}
};
void Func(A a)
{
}
int main(){
A a;
Func(a);
return 0;
}
则加上头文件后执行结果为:holle
- 如果函数额返回值时类A 的对象,则函数返回时,类A 的复制构造函数被调用。
class A{
public:
int v;
A (int n){v=n;};
A(const A & a){
v=a.v;
cout<<"holle"<<endl;
}
};
A Func(){
A a(4);
return a;
}
int main(){
cout<<Func().v<<endl;
reuturn 0;
}
则此程序执行的结果为:
holle
4
关于拷贝的深拷贝与浅拷贝请参考我的另外一篇博客:c++拷贝(shallow/deep拷贝)