构造函数与初始化列表
函数成员分类: 构造函数,析构函数,常函数,拷贝构造函数,内联函数,静态成员函数
构造函数
普通的数据成员不能在类内直接赋值,因为只有创建对象时才会分配空间,那么数据是如何赋初始值的?可以定义一个成员函数,对成员统一赋值
构造函数的形式:
类名(参数列表){} 无返回值,作用是对数据成员赋初始值
示例:
#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;
}
结果: