构造函数
C++中可以定义与类名相同的特殊成员函数
这种特殊的成员函数叫做构造函数
构造函数没有任何返回类型的声明
构造函数在对象调用时自动被调用
/*
测试代码
*/
#include <stdio.h>
class Test
{
private:
int i;
int j;
public:
Test() // 构造函数
{
printf("Test() Begin\n");
i = 1;
j = 2;
printf("Test() End\n");
}
int getI()
{
return i;
}
int getJ()
{
return j;
}
};
int main()
{
Test t;
printf("t.i = %d\n", t.getI());
printf("t.j = %d\n", t.getJ());
return 0;
}
运行结果
Test() Begin
Test() End
t.i = 1
t.j = 2
带有参数的构造函数
构造函数可以根据需要定义参数
一个类中可以存在多个重载的构造函数
构造函数的重载遵循C++重载的规则
/*
测试代码
*/
#include <stdio.h>
class Test
{
public:
Test()
{
printf("Test()\n");
}
Test(int v)
{
printf("Test(int v)\n");
}
};
int main()
{
Test t; // 调用Test()
Test t1(1); // 调用Test(int v)
Test t2 = 2; // 调用Test(int v)
return 0;
}
运行结果
Test()
Test(int v)
Test(int v)
构造函数的调用
一般情况下, 构造函数在对象定义时被自动调用
一些特殊情况下, 需要手工调用构造函数
/*
测试代码
手工调用构造函数
*/
#include <stdio.h>
class Test
{
private:
int m_value;
public:
Test()
{
printf("Test()\n");
m_value = 0;
}
Test(int v)
{
m_value = v;
printf("Test(int v), v = %d\n", v);
}
int getValue()
{
return m_value;
}
};
int main()
{
Test ta[3] = {Test(), Test(1), Test(2)}; // 手动调用构造函数
for(int i=0; i<3; i++)
{
printf("ta[%d].getValue() = %d\n", i , ta[i].getValue());
}
return 0;
}
运行结果
Test()
Test(int v), v = 1
Test(int v), v = 2
ta[0].getValue() = 0
ta[1].getValue() = 1
ta[2].getValue() = 2
特殊的构造函数
两个特殊的构造函数
无参构造函数
没有参数的构造函数
当类中没有定义构造函数时, 编译器默认提供一个无参构造函数, 并且其函数体为空
拷贝构造函数
参数为 const class_name& 的构造函数
当类中没有定义拷贝构造函数时, 编译器默认提供一个拷贝构造函数, 简单的进行成员变量的值复制
/*
测试代码
*/
#include <stdio.h>
class Test
{
private:
int i;
int j;
public:
/*
Test()
{
}
Test(const Test& t)
{
i = t.i;
j = t.j;
}
*/
int getI()
{
return i;
}
int getJ()
{
return j;
}
};
int main()
{
Test t1;
Test t2 = t1;
printf("t1.i = %d, t1.j = %d\n", t1.getI(), t1.getJ());
printf("t2.i = %d, t2.j = %d\n", t2.getI(), t2.getJ());
return 0;
}
运行结果
t1.i = -2, t1.j = 1970606434
t2.i = -2, t2.j = 1970606434
拷贝构造函数的意义
浅拷贝
拷贝后对象的物理状态相同
编译器默认提供的拷贝构造函数只进行浅拷贝
深拷贝
拷贝后对象的逻辑状态相同
当对象中的成员代替了系统中的资源时, 需自定义拷贝构造函数进行深拷贝