构造函数的作用是在创建类的对象时进行类对象初始化的。
在 C++ 中,每个类都有且必须有构造函数。如果用户没有自行编写构造函数,则 C++ 自动提供一个无参数的构造函数,称为默认构造函数。这个默认构造函数不做任何初始化工作。一旦用户编写了构造函数,则这个无参数的默认构造函数就消失了。如果用户还希望能有一个无参数的构造函数,必须自行编写。
构造函数也是一种函数, 所以在定义时可以将其定义为有参数和无参数两种,如下所示:
class node {
private:
int length;
public:
node();
node(int len);
~node();
void getLength();
};
node::node()
{
length = 100;
}
node::node(int len)
{
length = len;
}
node::~node()
{
}
void node::getLength()
{
std::cout << length << std::endl;
}
以上为一个 node 类的定义,可以看到两种不同的对象初始化的构造函数:
第一种:
node::node()
{
length = 100;
}
第二种:
node::node(int len)
{
length = len;
}
两种构造函数都可以对初始化对象,区别是第一种在初始化对象时固定了对象的成员 length;第二种可以由输入参数确定对象成员 length。
注意事项
在调用两种构造函数时,情况有所不同
第一种情况
int main()
{
node temp1;
temp1.getLength();
return 0;
}
这种调用方式是正确的,创建对象时会调用第一种无参数的构造函数,程序输出如下:
第二种情况
int main()
{
node temp1(20);
temp1.getLength();
return 0;
}
这种调用方式也是正确的,创建对象时会调用第二种带参数的构造函数,程序输出如下:
重头戏 第三种情况
假如修改类的定义,去掉带参数的构造函数,只留下无参数的构造函数,如下所示:
class node {
private:
int length;
public:
node();
~node();
void getLength();
};
node::node()
{
length = 100;
}
node::~node()
{
}
void node::getLength()
{
std::cout << length << std::endl;
}
在创建对象时调用构造函数也会有两种情况:
第一种情况
int main()
{
node temp1;
temp1.getLength();
return 0;
}
与上面所述一样,程序正确,输出如下:
++第二种情况++
平常在调用无参数的自定义函数时,结尾都要加上括号,如下所示:
void test()
{
......
}
int main()
{
test();
return 0;
}
在调用 test() 函数时,结尾会加上 ()。
但是在调用无参数的构造函数创建对象时,
不能加括号!!!
不能加括号!!!
不能加括号!!!
int main()
{
node temp1();
temp1.getLength();
return 0;
}
程序报错,无法运行。
在 CodeBlocks 中这样写会报错:
但是在 Visual Studio 中这样写不会报错,程序也不会运行构造函数初始化对象,所以一定要注意!!!