构造函数与初始化列表

275 阅读3分钟

构造函数与初始化列表

函数成员分类: 构造函数,析构函数,常函数,拷贝构造函数,内联函数,静态成员函数

构造函数

普通的数据成员不能在类内直接赋值,因为只有创建对象时才会分配空间,那么数据是如何赋初始值的?可以定义一个成员函数,对成员统一赋值

构造函数的形式: 类名(参数列表){} 无返回值,作用是对数据成员赋初始值

示例:

#include <iostream>
using namespace std;

class C_Stu 
{
public:
 C_Stu()
 {
  cAge = 10;
  cout << cAge << endl;
 }
private:
 int cAge;
};

int main()
{
 C_Stu stu;//栈区对象
  C_Stu *pStu = new C_Stu;//堆区对象
  delete pStu;
 return 0;
}

结果: 从结果看出,我们并没有调用构造函数,只是在主函数中创建了对象,原因是在创建对象时会自动调用构造函数,注意声明对象指针时并不会调用构造函数,new空间时才会调用构造函数

构造函数的类型:

  • 默认构造函数:系统会自动生成一个构造函数,若用户声明了此构造函数,默认的构造函数就没有了
默认构造函数形式:
C_Stu(){}
  • 无参数
  • 有参数的构造函数:可以指定默认值,也可以通过对象传递
#include <iostream>
using namespace std;

class C_Stu 
{
public:
 C_Stu()
 {
  cAge = 10;
  c = 'c';
  cout << cAge << "" << c << endl;
 }
 C_Stu(int cAge ,char c )
 {
  cout << cAge<< "" <<c<< endl;
 }
private:
 int cAge;
 char c;
};

int main()
{
  C_Stu stu(30,'f');
 C_Stu* pStu = new C_Stu(20, 'a');
 return 0;
}

结果:

  • 多个构造函数构成重载

初始化与赋值的区别

初始化的一个变量或者对象产生之时就赋予一个初始值,赋值是一个变量产生之后的任意时刻赋予一个值,引用和const变量只能做初始化不能赋值

int a = 10; //初始化
a=20;//赋值

int &b = a;//初始化
const int c =50; //初始化
c = 60 // 错误

初始化列表

形式,在构造函数之后加个冒号:f(a),a(13)

class CStu
{
public:
 int a;
 int f;
 CStu() : f(a), a(13){}
};

初始化方法:

通过数值对数据成员初始化,数据成员之间相互初始化,需要注意初始化顺序,与声明成员的顺序有关

stu():f(a),a(13),先对于a进行初始化,若改为
stu():f(12),a(f),a的值不确定
#include <iostream>
using namespace std;

class CStu
{
public:
 int a;
 int f;

 CStu() : f(12), a(f)//成员初始化顺序 只与声明的顺序有关,跟初始化列表的书写顺序无关
{ 
}
 void Show()
 {
  cout << a << ' ' << f << endl;
 }
};

int main()
{
 CStu stu;
 stu.Show();
 
 system("pause");
 return 0;
}

通过构造函数参数对数据成员进行初始化

CStu(int d,float c):a(d),f(c)

引用和const的初始化

初始化方法:

#include <iostream>

using namespace std;

class Stu 
{
public:
 Stu(int& c) :a(c), b(c), e(c)
 {
  cout << a <<" "<< b << " " << e << endl;
 }
 Stu(int& c,int f) :a(c), b(c), e(f)
 {
  cout << a << " " << b << " " << e << endl;
 }
private:
 int &a;
 int b;
 const int e;
};

int main()
{
 int c = 12;
 Stu stu1(c);
 
 Stu stu2(c,10);
 return 0;
}

结果: 注意初始化顺序

数组和结构体使用初始化列表

#include <iostream>
using namespace std;

struct STU
{
 int i;
 float f;
};

class CStu
{
public:
 int a[4];
 STU st;
 CStu(STU sd) : st(sd)//: a() //不是所有的编译器都允许
 {
  cout << sd.i << " " << sd.f << endl;
  //个人
  /*for (int i = 0; i < 4; i++)
  {
   a[i] = 0;
  }*/
  st.f = 12.23;

  memset(&a[0], 0, 16);  //不要越界
 }

 void Show()
 {
  cout << st.i << " " << st.f << endl;

  for (int i = 0; i < 4; i++)
  {
   cout << a[i] << endl;
  }
 }
};

int main()
{
 STU sf = {123, 123.2f};

 CStu stu(sf);

 stu.Show();

 //STU s1 = {12, 2.3f};
 //STU s2 = s1;

 //cout << s2.i << " " << s2.f << endl;
 
 system("pause");
 return 0;
}

结果: