构造函数的作用是初始化对象的数据成员。
1) 无参数构造函数
如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做。只要你写了某一种构造函数,系统就不会再自动生成这样一个默认的构造函数,如果希望有一个这样的无参构造函数,则需要自己显式地写出来。
2) 一般构造函数
一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,形成构造函数重载,创建对象时根据传入的参数不同调用不同的构造函数。
3) 复制构造函数(拷贝构造函数)
复制构造函数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象。若没有显式的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,需要考虑 “浅拷贝” 、“深拷贝”的问题。
4) 类型转换构造函数
根据一个指定的类型的对象创建一个本来的对象。
5) 运算符重载
由于运算符重载与复制构造函数有点像,这里也顺便讨论一下,运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。函数名是由关键字operator和其后要重载的运算符符号构成。
下面通过一个例子说明构造函数的用法:
声明:
Test.h
class A
{
private:
int value_1;
int value_2;
public:
//无参数构造函数
A(void);
//一般构造函数
A(int i, int j);
//复制构造函数
A(const A& other);
//类型转换构造函数
A(int a);
//赋值运算符函数
A &operator = (const A &str);
};
定义:
Test.cpp
#include "Test.h"
//无参数构造函数
A::A(void)
{
}
//一般构造函数
A::A(int i, int j)
{
value_1 = i;
value_2 = j;
}
//复制构造函数
A::A(const A& other)
{
value_1 = other.value_1;
value_2 = other.value_2;
}
//类型转换构造函数
A::A(int a)
{
value_1 = a;
value_2 = 5;
}
//赋值运算符函数
A& A::operator=(const A &str)
{
if (this == &str)
{
return *this;
}
this->value_1 = str.value_1;
this->value_2 = str.value_2;
return *this;
}
测试:
#include "Test.h"
void main()
{
//调用无参数构造函数
A a1,a2;
//调用一般构造函数
A a3(1,2);
A a4 = A(3,4);
//调用赋值运算符函数
a1 = a3;
//先调用类型转换构造函数,再调用赋值构造函数
a2 = 5;
//调用拷贝构造函数
A a5(a1);
A a6 = a2;
}