基本概念

为什么需要他
语法演示
构造函数的基本应用
//以前的你是这样的#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 CalledConstructor No.1 CalledConstructor No.1 CalledConstructor No.3 Called1 2Constructor No.3 Called3 4Constructor No.3 Called5 6Constructor No.2 Called7 -1(不定值)Constructor No.2 Called8 -1Constructor No.2 Called9 -1Constructor No.1 CalledConstructor No.1 CalledConstructor No.1 CalledConstructor No.3 Called1 2Constructor No.3 Called3 4Constructor No.3 Called5 6*/