--事物的难度远远低于对事物的恐惧!
在开始对象的构造知识点讲解之前,我们先来思考个小问题:生成一个类对象时,其中的成员变量的初始值是多少?要理解上边的问题,我们首先要有一个概念:定义类对象可视为定义变量,根据我们C语言的基础,在全局区、栈空间、堆空间定义的变量,初始值都有所不同,其中全局区初始值为0,栈空间上为随机值,堆空间上为随机值。
那么我们以下边的代码来验证一下我们的猜想:
#include <iostream>
using namespace std;
class testClass
{
private:
int i;
int j;
public:
int getI()
{
return i;
}
int getJ()
{
return j;
}
};
testClass t1; //全局区上定义类对象
int main()
{
testClass t2; //栈空间上定义类对象
testClass *t3 = new testClass; //堆空间上定义类对象
cout << "t1.getI() = " << t1.getI() << endl;
cout << "t1.getJ() = " << t1.getJ() << endl << endl;
cout << "t2.getI() = " << t2.getI() << endl;
cout << "t2.getJ() = " << t2.getJ() << endl << endl;
cout << "t3->getI() = " << t3->getI() << endl;
cout << "t3->getJ() = " << t3->getJ() << endl;
delete t3;
system("pause");
return 0;
}
编译输出如下:
从输出我们可以看到,跟我们设想的一样,定义对象与定义变量一样。
-栈上定义的对象,成员变量初始值为随机值
-堆上定义的对象,成员变量的初始值为随机值
-全局区定义的对象,成员变量的初始值为0
因为初始值得不确定,那么如果想要初始化一个对象,改怎么解决?
-为每个类增加一个初始化成员函数init(),在对象定义后显示调用该函数(缺点是需要立即显示调用,隐患较大)
-使用C++中的构造函数
由于第一种方式弊端较多,我们重点来分析第二种方式;首先来看下C++中的构造函数的概念
-C++中构造函数:是一种特殊的成员函数, 函数名与类名相同,无返回值,类对象创建时自动调用
所以上边代码中的testClass类的构造函数为:testClass(),重新更新代码如下:
#include <iostream>
using namespace std;
class testClass
{
private:
int i;
int j;
public:
testClass() //构造函数,对象创建时自动调用
{
cout << "testClass() called" << endl;
i = 1;
j = 2;
}
int getI()
{
return i;
}
int getJ()
{
return j;
}
};
testClass t1; //全局区上定义类对象
int main()
{
testClass t2; //栈空间上定义类对象
testClass *t3 = new testClass; //堆空间上定义类对象
cout << "t1.getI() = " << t1.getI() << endl;
cout << "t1.getJ() = " << t1.getJ() << endl << endl;
cout << "t2.getI() = " << t2.getI() << endl;
cout << "t2.getJ() = " << t2.getJ() << endl << endl;
cout << "t3->getI() = " << t3->getI() << endl;
cout << "t3->getJ() = " << t3->getJ() << endl;
delete t3;
system("pause");
return 0;
}
编译输出如下:
由输出可以看到,我们定义了三个对象,构造函数被调用的3次,也就是说在定义对象时就自动调用构造函数去初始对象。
总结:
-C++中可以通过构造函数完成对象的初始化
-C++中的构造函数是一种特殊的成员函数, 函数名与类名相同,无返回值,类对象创建时自动调用