更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

C++的构造函数构造特点是什么?

  • 发布:C++培训
  • 来源:问答库
  • 时间:2020-07-06 11:12

我们在C语言中使用堆栈中的变量时,常常需要给它赋初始值,用于避免使用到了不可预知的值。同样的,在C++中也需要有这样的动作,只是由于C++的对象可能比基本数据要复杂得多,因此使用了一系列的函数来完成这件事。这些函数就是构造函数。那么构造函数到底是怎样,又该如何使用呢?

为什么需要构造函数

有的人可能会奇怪,发现自己写的代码即便没有初始化,也有正常的初始值,而且每次运行都是一样,而不是随机的,这是为什么呢?

#include<stdio.h>

int main(void)

{

int i; //没有初始化

printf("%d\n"); //一般来说每次运行结果都是随机值

return 0;

}

首先,各个编译器实现可能不一样,具体怎么不一样,有兴趣可以去了解,但是需要注意的,按照标准来做,而不依赖于特定编译器的特性行为,即养成初始化的好习惯。因此在C++也常常需要构造函数来控制对象的初始化。

构造函数有什么特点

C++中的构造函数有哪些需要注意的呢?在《C++类初识》中已有所介绍,这里再稍微展开一下。

构造函数没有返回值

构造函数名与类名相同

构造函数可以重载

构造函数不能被声明成const

构造函数的返回值我们是拿不到的,因而其返回值对我们来说也是没有意义的。

一个类可以有多个构造函数,其函数名一致,形参不同,因而构造函数可以重载。

我们创建类的一个const对象的时候,需要等到构造函数执行完成,或者说只有初始化完成,才能有真正的const属性。如果构造函数被声明成const,那么它就不能修改成员变量,这样就没法完成初始化了。如下面的代码所示:

#include <iostream>

using namespace std;

class Test

{

private:

int a;

public:

Test() const

{

/*do something*/

}

};

int main()

{

Test test;

cout<<sizeof(test)<<endl;

return 0;

}

如果将构造函数声明为const,将会出现编译错误:

error: constructors may not be cv-qualified

Test() const

提示构造函数不能被const修饰。

默认构造函数

如果没有定义任何构造函数,编译器会为我们提供无参的默认构造函数。但是有例外,如果定义了自己的构造函数,编译器也不会提供默认构造函数。如果类中某个成员它自己没有默认构造函数(无参构造函数),那么编译器也就不能合成默认构造函数。

请看下面的示例:

#include <iostream>

using namespace std;

class Foo

{

int value = 0;

public:

Foo(int val):value(val){}

};

class Test

{

private:

Foo foo;

};

int main()

{

Test test;

cout<<sizeof(test);

return 0;

}

我们定义了两个类,一个Foo,有一个构造函数,但是没有无参构造函数;一个Test,没有定义构造函数,准备让编译器生成默认的。但是不幸的是编译器报错了:

no matching function for call to ‘Foo::Foo()’

也就是说,它试图去调用自己成员的无参构造函数,但是由于成员自己没有,所以报错了。另外,从这个例子中我们也可以看到,由于Foo中已经定义了自己的构造函数,因此编译器不会为它生成默认的构造函数。如何解决呢?只需要在Foo类中增加这么一句就可以使用默认构造函数了:

Foo()= default;

总结

关于构造函数的内容还有很多,在介绍继承,多态,拷贝,移动等内容后再展开,本文总结如下:

构造函数没有返回值

构造函数名与类名相同

构造函数可以重载

构造函数不能被声明成const

对于只有一个实参的构造函数而言,可以使用拷贝形式的初始化

类中某个成员它自己没有默认构造函数(无参构造函数),那么编译器也就无法合成默认构造函数

如果定义了自己的构造函数,编译器将不会合成默认构造函数

对于有const或者引用的成员变量,必须在构造函数中给它初始化

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:“偷梁换柱”的库打桩机制
下一篇:C++数据类型(data type)你知道多少?

空指针到底是什么意思?

a[i] = i++ 到底对不对?

C++培训哪家好?全方位对比机构

C/C++中的必须熟记的基础知识

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省