C++ 类 :有参数构造函数与无参数构造函数使用注意事项

构造函数的作用是在创建类的对象时进行类对象初始化的。

在 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 中这样写不会报错,程序也不会运行构造函数初始化对象,所以一定要注意!!!

  • 28
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
C++中的构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。构造函数可以看作是一种特殊的初始化函数,用于初始化对象的状态和属性。 以下是一些注意事项: 1.构造函数的名称必须的名称相同,并且没有返回型(包括void)。 2.构造函数可以有参数,这些参数用于初始化对象的数据成员。如果没有指定构造函数,则使用默认构造函数,它将数据成员初始化为默认值。 3.如果定义了多个构造函数,则这些函数可以具有不同的参数列表(重载构造函数),这样可以灵活地创建对象。 4.构造函数可以被重载,但是它们必须具有不同的参数列表(参数型或参数数量不同)。 5.构造函数可以是公有、私有或受保护的。公有构造函数可以被任何人调用,私有和受保护构造函数只能在内部或其派生使用。 6.构造函数可以使用成员初始化列表来初始化数据成员,这是一种更有效的方法,可以避免使用赋值运算符。 7.构造函数的执行顺序是先基构造函数,然后按照声明顺序执行成员变量的构造函数,最后执行自身构造函数。 8.构造函数可以抛出异常,但是在构造函数使用动态内存分配时需要小心,因为如果分配失败,可能会导致不一致的对象状态。 总之,构造函数是面向对象编程中非常重要的一个概念,了解和正确使用构造函数可以使我们更好地设计、实现和维护对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值