2.6构造函数
构造函数的定义----成员函数的一种
- l 名字和类相同,可以有参数,不能有返回值(void也不行)
- l 作用是对对象进行初始化,给成员变量赋初值
- l 如果定义类时没有写构造函数,则编译器生成一个默认的无参数的构造函数
默认构造函数无参数,不做任何操作
- l 如果定义了构造函数,则编译器不生成默认的无参数的构造函数
- l 对象生成时构造函数自动被调用。对象一旦生成,就再也不能再其上执行构造函数
只要有对象生成,不管以何种方式生成的时候,必须会调用构造函数。
- l 一个类可以有多个构造函数
为什么需要构造函数:
1)构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用担心忘记调用初始化函数。
2)有时对象没被初始化就使用,会导致程序出错。
例1. classComplex {
private:
double real,imag;
public:
void Set(double r,double i);
};
Complex c1;
Complex *pc = newComplex; //这里同样也是需要用默认构造函数。
例2.
class Complex{
private:
double real,imag;
public:
Complex(double r,double i = 0);
};
Complex::Complex(doubler, double i){
real = r;
imag = i;
}
Complex c1;//error, 缺少构造函数的参数。
Complex *pc = newComplex; // error, 没有参数。
Complex cl(2); //OK
Complexc1(2,3),c2(3,5); OK
Complex *pc = newComplex(3,4 );
一个类可以有多个构造函数,参数个数或者参数类型不同
class Complex {
private:
double real,imag;
public:
void Set(double r, double i);
Complex(double r, double i);
Complex(double r);
Complex(Complex cl,Complex c2);
};
Complex::Complex(doubler, double i){
real = r;
imag = i;
}
Complex::Complex(doubler){
real r; imag = 0;
}
Complex::Comple(Complexc1,Complex c2){
real = c1.real + c2.real;
imag = c1.imag + c2.imag;
}
Complex c1(3),c2(1,0), c3(c1,c2);
构造函数在对象数组中的使用
#include<iostream>
using namespacestd;
class CSample {
int x;
public:
CSample(){
cout<<"Constuctor 1Called"<<endl;
}
CSample(int n){
x = n;
cout<<"Constructor 2Called"<<endl;
}
};
int main(){
CSample array1[2];
cout<<"step1"<<endl;
CSample array2[2]={4,5};
cout<<"step2"<<endl;
CSample array3[2] = {3};
cout<<"step3"<<endl;
CSample *array4 = new CSample[2];
delete [] array4;
cout<<"step4"<<endl;
array4 = new CSample[2]{2,3};
delete [] array4;
cout<<"step5"<<endl;
array4 = new CSample[2]{1};
delete [] array4;
cout<<"step6"<<endl;
return 0;
}
例3.
#include <iostream>
using namespace std;
class Test{
public:
Test(int n){ } //(1)
Test(int n,int m){ }//(2)
Test(){ }//(3)
};
int main{
Test array1[3] = {1,Test(1,2)};
//数组里面的三个元素分别用(1),(2),(3)进行初始化
Test array2[3] = {Test(2,3),Test(1,2),1};
//(2),(2),(1)
Test *parray[3] = {new Test(4),new Test(1,2)};
//只生成了2个对象。
return 0;
}