基本概念
为什么需要他
语法演示
构造函数的基本应用
//以前的你是这样的
#include<bits/stdc++.h>
using namespace std;
class Complex
{
public:
double real,imag;
void getComplex(void);
};
void Complex::getComplex(void)
{
if(imag==0.0) std::cout<<real<<endl;
else if(imag>0.0) std::cout<<real<<"+"<<imag<<"i"<<endl;
else std::cout<<real<<imag<<"i"<<endl;
}
int main(void)
{
Complex c1;
Complex *c2=new Complex;
c1.real=3,c1.imag=4;
c2->real=7,c2->imag=8;
c1.getComplex();
c2->getComplex();
return 0;
}
//现在是这样的
#include <bits/stdc++.h>
using namespace std;
class Complex
{
public:
double real, imag;
void getComplex(void);
Complex(double r, double i = 0);
Complex(const Complex &c1, const Complex &c2);
};
void Complex::getComplex(void)
{
if (imag == 0.0)
std::cout << real << endl;
else if (imag > 0.0)
std::cout << real << "+" << imag << "i" << endl;
else
std::cout << real << imag << "i" << endl;
}
Complex::Complex(double r, double i)
{
real = r;
imag = i;
}
Complex::Complex(const Complex &c1, const Complex &c2)
{
real = c1.real + c2.real;
imag = c1.imag + c2.imag;
}
int main(void)
{
Complex c1(2); //OK
Complex *c2 = new Complex(3, 4); //OK
Complex c3; //Error
Complex *c4 = new Complex; //Error
c1.getComplex(); //2
c2->getComplex(); //3+4i
Complex c3(c1, *c2);
c3.getComplex(); //5+4i
return 0;
}
构造函数在数组中的应用
构造函数没有参数或只有一个参数
#include<bits/stdc++.h>
using namespace std;
class CSample
{
private:
int x;
public:
CSample(void);
CSample(int);
};
CSample::CSample(void)
{
std::cout<<"Constructor No.1 Called"<<endl;
}
CSample::CSample(int n)
{
x=n;
std::cout<<"Constructor No.2 Called"<<endl;
}
int main(void)
{
cout<<"Step 1"<<endl;
CSample s1[2];//未声明参数
cout<<"Step 2"<<endl;
CSample s2[2]={4,5};//两个对象全部声明参数
cout<<"Step 3"<<endl;
CSample s3[2]={2};//仅有一个对象声明参数
cout<<"Step 4"<<endl;
CSample *s4=new CSample[2];//未声明参数
return 0;
//Output:
/*Step 1
Constructor No.1 Called
Constructor No.1 Called
Step 2
Constructor No.2 Called
Constructor No.2 Called
Step 3
Constructor No.2 Called
Constructor No.1 Called
Step 4
Constructor No.1 Called
Constructor No.1 Called*/
}
构造函数有两个(多个参数)
#include<bits/stdc++.h>
using namespace std;
class CSample
{
private:
int x,y;
public:
CSample(void);//无参构造函数
CSample(int);//单参构造函数
CSample(int,int);//双参构造函数
void getSample(void);
};
CSample::CSample(void)
{
std::cout<<"Constructor No.1 Called"<<endl;
}
CSample::CSample(int n)
{
x=n;
std::cout<<"Constructor No.2 Called"<<endl;
}
CSample::CSample(int m,int n)
{
x=m;
y=n;
std::cout<<"Constructor No.3 Called"<<endl;
}
void CSample::getSample(void)
{
std::cout<<x<<ends<<y<<endl;
}
int main(void)
{
CSample s1[3];//无参初始化
int a=0,b=0;
for(int i=0;i<3;i++)
{
cin>>a>>b;//1 2 3 4 5 6
s1[i]=CSample(a,b);//双参初始化,注意这里CSample(a,b)生成的是临时对象,赋给s1[i]后
s1[i].getSample(); //自动消亡,下面同理
}
for(int i=0;i<3;i++)
{
cin>>a;//7 8 9
s1[i]=CSample(a);//单参初始化 且是全部重新初始化,不单单是在原来的基础上把x改掉
s1[i].getSample();
}
for(int i=0;i<3;i++)
{
s1[i]=CSample();//无参初始化
}
CSample *s2[3];//三个对象指针
for(int i=0;i<3;i++)
{
std::cin>>a>>b;//1 2 3 4 5 6
s2[i]=new CSample(a,b);//new初始化,注意这里生成的反而不是临时对象,赋值后不会立刻消亡
s2[i]->getSample();
}
delete [] s2;
return 0;
}
/*Output
Constructor No.1 Called
Constructor No.1 Called
Constructor No.1 Called
Constructor No.3 Called
1 2
Constructor No.3 Called
3 4
Constructor No.3 Called
5 6
Constructor No.2 Called
7 -1(不定值)
Constructor No.2 Called
8 -1
Constructor No.2 Called
9 -1
Constructor No.1 Called
Constructor No.1 Called
Constructor No.1 Called
Constructor No.3 Called
1 2
Constructor No.3 Called
3 4
Constructor No.3 Called
5 6
*/