C/C++培训
达内IT学院
400-996-5531
我们在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或者引用的成员变量,必须在构造函数中给它初始化
版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved