基本概念

1.PNG
2.PNG

为什么需要他

2.PNG

语法演示

构造函数的基本应用

  1. //以前的你是这样的
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. class Complex
  5. {
  6. public:
  7. double real,imag;
  8. void getComplex(void);
  9. };
  10. void Complex::getComplex(void)
  11. {
  12. if(imag==0.0) std::cout<<real<<endl;
  13. else if(imag>0.0) std::cout<<real<<"+"<<imag<<"i"<<endl;
  14. else std::cout<<real<<imag<<"i"<<endl;
  15. }
  16. int main(void)
  17. {
  18. Complex c1;
  19. Complex *c2=new Complex;
  20. c1.real=3,c1.imag=4;
  21. c2->real=7,c2->imag=8;
  22. c1.getComplex();
  23. c2->getComplex();
  24. return 0;
  25. }
  1. //现在是这样的
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. class Complex
  5. {
  6. public:
  7. double real, imag;
  8. void getComplex(void);
  9. Complex(double r, double i = 0);
  10. Complex(const Complex &c1, const Complex &c2);
  11. };
  12. void Complex::getComplex(void)
  13. {
  14. if (imag == 0.0)
  15. std::cout << real << endl;
  16. else if (imag > 0.0)
  17. std::cout << real << "+" << imag << "i" << endl;
  18. else
  19. std::cout << real << imag << "i" << endl;
  20. }
  21. Complex::Complex(double r, double i)
  22. {
  23. real = r;
  24. imag = i;
  25. }
  26. Complex::Complex(const Complex &c1, const Complex &c2)
  27. {
  28. real = c1.real + c2.real;
  29. imag = c1.imag + c2.imag;
  30. }
  31. int main(void)
  32. {
  33. Complex c1(2); //OK
  34. Complex *c2 = new Complex(3, 4); //OK
  35. Complex c3; //Error
  36. Complex *c4 = new Complex; //Error
  37. c1.getComplex(); //2
  38. c2->getComplex(); //3+4i
  39. Complex c3(c1, *c2);
  40. c3.getComplex(); //5+4i
  41. return 0;
  42. }

构造函数在数组中的应用

构造函数没有参数或只有一个参数

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. class CSample
  4. {
  5. private:
  6. int x;
  7. public:
  8. CSample(void);
  9. CSample(int);
  10. };
  11. CSample::CSample(void)
  12. {
  13. std::cout<<"Constructor No.1 Called"<<endl;
  14. }
  15. CSample::CSample(int n)
  16. {
  17. x=n;
  18. std::cout<<"Constructor No.2 Called"<<endl;
  19. }
  20. int main(void)
  21. {
  22. cout<<"Step 1"<<endl;
  23. CSample s1[2];//未声明参数
  24. cout<<"Step 2"<<endl;
  25. CSample s2[2]={4,5};//两个对象全部声明参数
  26. cout<<"Step 3"<<endl;
  27. CSample s3[2]={2};//仅有一个对象声明参数
  28. cout<<"Step 4"<<endl;
  29. CSample *s4=new CSample[2];//未声明参数
  30. return 0;
  31. //Output:
  32. /*Step 1
  33. Constructor No.1 Called
  34. Constructor No.1 Called
  35. Step 2
  36. Constructor No.2 Called
  37. Constructor No.2 Called
  38. Step 3
  39. Constructor No.2 Called
  40. Constructor No.1 Called
  41. Step 4
  42. Constructor No.1 Called
  43. Constructor No.1 Called*/
  44. }

构造函数有两个(多个参数)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. class CSample
  4. {
  5. private:
  6. int x,y;
  7. public:
  8. CSample(void);//无参构造函数
  9. CSample(int);//单参构造函数
  10. CSample(int,int);//双参构造函数
  11. void getSample(void);
  12. };
  13. CSample::CSample(void)
  14. {
  15. std::cout<<"Constructor No.1 Called"<<endl;
  16. }
  17. CSample::CSample(int n)
  18. {
  19. x=n;
  20. std::cout<<"Constructor No.2 Called"<<endl;
  21. }
  22. CSample::CSample(int m,int n)
  23. {
  24. x=m;
  25. y=n;
  26. std::cout<<"Constructor No.3 Called"<<endl;
  27. }
  28. void CSample::getSample(void)
  29. {
  30. std::cout<<x<<ends<<y<<endl;
  31. }
  32. int main(void)
  33. {
  34. CSample s1[3];//无参初始化
  35. int a=0,b=0;
  36. for(int i=0;i<3;i++)
  37. {
  38. cin>>a>>b;//1 2 3 4 5 6
  39. s1[i]=CSample(a,b);//双参初始化,注意这里CSample(a,b)生成的是临时对象,赋给s1[i]后
  40. s1[i].getSample(); //自动消亡,下面同理
  41. }
  42. for(int i=0;i<3;i++)
  43. {
  44. cin>>a;//7 8 9
  45. s1[i]=CSample(a);//单参初始化 且是全部重新初始化,不单单是在原来的基础上把x改掉
  46. s1[i].getSample();
  47. }
  48. for(int i=0;i<3;i++)
  49. {
  50. s1[i]=CSample();//无参初始化
  51. }
  52. CSample *s2[3];//三个对象指针
  53. for(int i=0;i<3;i++)
  54. {
  55. std::cin>>a>>b;//1 2 3 4 5 6
  56. s2[i]=new CSample(a,b);//new初始化,注意这里生成的反而不是临时对象,赋值后不会立刻消亡
  57. s2[i]->getSample();
  58. }
  59. delete [] s2;
  60. return 0;
  61. }
  62. /*Output
  63. Constructor No.1 Called
  64. Constructor No.1 Called
  65. Constructor No.1 Called
  66. Constructor No.3 Called
  67. 1 2
  68. Constructor No.3 Called
  69. 3 4
  70. Constructor No.3 Called
  71. 5 6
  72. Constructor No.2 Called
  73. 7 -1(不定值)
  74. Constructor No.2 Called
  75. 8 -1
  76. Constructor No.2 Called
  77. 9 -1
  78. Constructor No.1 Called
  79. Constructor No.1 Called
  80. Constructor No.1 Called
  81. Constructor No.3 Called
  82. 1 2
  83. Constructor No.3 Called
  84. 3 4
  85. Constructor No.3 Called
  86. 5 6
  87. */