浅谈构造函数

为什么需要构造函数

int main()
{
	int i;
	printf("%d\n");
	system("pause");
	return 0;
}

在上面这段代码中,i并没有初始化,但是它可以通过编译,而且每次运行出的结果也一样(按理来说,应该是一个随机数),为什么会这样呢?因为在C++中有一个默认的构造函数来控制对象的初始化。

首先来说一说构造函数的特点

  • 构造函数没有返回值
  • 构造函数可以重载
  • 构造函数不能被声明成const
  • 构造函数名与类名相同

我们在写代码的时候得不到构造函数的返回值,不过对我们来说也没有意义。

一个类可以有多个构造函数,它们的函数名相同,但是参数列表不同,因此构造函数可以重载。

默认构造函数

但没有定义任何构造函数时,系统会提供默认的构造函数(无参),当然也会有一些例外,如下

  1. 当我们定义了自己的构造函数后,系统就不会提供默认的构造函数
  2. 当类中某个成员没有定义构造函数(其他成员已经定义了构造函数),此时系统也不会提供默认的构造函数

如以下代码示例

#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);
	system("pause");
	return 0;
}

上述代码中定义了两个类,分别是Foo和 Test,在Foo中定义了一个无参构造函数,在Test中没有定义构造函数,这就导致出现错误。这就说明当类中某个成员没有定义构造函数时,系统不会提供默认的构造函数。

那么该如何解决这个问题呢?只需要在Foo类中加上这样的一句话即可

	Foo() = default;

构造函数初始值

给构造函数中的成员赋值可采用以下这种方式

class Day
{
private:
	int day;
	int month;
public:
	Day(int a) : month(a), day(a*30){}

	void printDay()
	{
		cout << "month:" << month <<"," <<"day:" << day << endl;
	}
};

int main()
{
	Day day(3);
	day.printDay();
	system("pause");
	return 0;
}

输出结果为

month:3,day:90

构造函数的书写格式还有一种,如下

	Day(int a)
	{
		month = a;
		day = a * 30;
	}

初始化const和引用成员

在使用const和引用是必须初始化,因此对于有const或者引用的成员变量,必须在构造函数中**初始化,**并不是赋值
没有初始化的情况

class Test
{
private:
	const int age;
	string &name;

赋值的情况

class Test
{
private:
	const int age;
	string &name;
public:
	Test(int a, string n)
	{
		age = a;
		name = n;
	}
};

以上两种情况都不能通过编译

以下给出正确的做法

class Test
{
private:
	const int age;
	string &name;
public:
	Test(int a, string n) : age(a), name(n) {}
};

这也是构造函数两种不同的写法的区别

总结

对于构造函数给出以下几点总结:

  • 构造函数没有返回值
  • 构造函数可以重载
  • 构造函数不能被声明成const
  • 构造函数名与类名相同
  • 对于只有一个实参的构造函数而言,可以使用拷贝形式的初始化
  • 类中某个成员没有定义构造函数,那么系统也不会提供默认的构造函数
  • 如果定义了自己的构造函数,编译器就不会提供默认的构造函数
  • 对于有const或引用的成员变量,必须在构造函数中给它初始化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值