1.构造函数
作用:创建对象的时候,由系统自动完成对象的初始化工作,每创建一个对象时,系统将自动调用该对象的构造函数。
一个对象若未设定构造函数,则系统会自动添加一个无参无操作的构造函数,每个对象完成创建时必须调用构造函数。
2.构造函数的表示
(1)构造函数的函数名与其类名同名。
(2)构造函数是类的成员函数,访问权限一般被设置为public。
(3)构造函数无返回值类型。
3.构造函数的示例
class Base
{
int x, y;
public:
Base(int a, int b)
{
x = a;
y = b;
}
void print()
{
cout<<x<<","<<y<<endl;
}
};
int main()
{
Base b(3,5);
b.print();//3,5
}
4.构造函数需要注意的几个知识点
(1)构造函数可以在类外实现,必须要加类的作用域,类似于类内的其他函数。
(2)构造函数由系统自动调用,在程序中不可以显式的随意调用。
(3)对象,对象数组在创建时,系统会自动调用构造函数,对于对象数组而言,系统会为每个数组元素调用一次构造函数。
(4)定义指向对象的指针和对象的引用时,系统不会调用构造函数。因为这个时候并没有创建对象。
(5)构造函数没有返回值。构造函数是一种特殊类型的函数,并没有返回值,主要要区别于void(无返回值类型),void也是属于一种返回值。
5.有了构造函数之后的方便之处
创建对象时可以这样使用:
类名 对象名(初始化值);
这样的话,系统自动为对象调用构造函数时就会自动将初始化值传递给构造函数的形参。
6.构造函数的重载
构造函数是可以重载的,重载条件同一般函数一样,同样,构造函数也可以设置默认形参,设置方法及规则也同一班函数一致。
7.一个类中含有其他类的对象
#include <iostream.h>
class Student
{
public:
Student()
{
cout<<"Constructing Student."<<endl;
}
};
class Teacher
{
public:
Teacher()
{
cout<<"Constructing Teacher."<<endl;
}
};
class School
{
public:
School()
{
cout<<"Constructing School."<<endl;
}
private:
Student s;
Teacher t;
};
int main()
{
School sc;
cout<<"Back in main."<<endl;
}
输出结果:
Constructing Student.
Constructing Teacher.
Constructing School.
Back in main.
分析:若类A的对象是类B的数据成员,创建类B的对象时,必须是先调用子对象(也就是A的对象)的构造函数,然后再调用类B对象的构造函数。
我自己理解的原因是:构造函数是为了完成对本类对象的初始化,那么初始化一定需要先有被初始化的对象,在这个例子中也就是s和t,所以必须要先创建出s和t,而s和t的创建就需要调用s和t的构造函数,s和t创建好了之后就需要调用对象sc的构造函数了。