关于构造函数的两三事

  构造函数分为很多种,我这里可以大致分为默认构造函数、普通的构造函数和复制构造函数三种。我们需要知道的一点是,多数非内置类型是用构造函数来进行初始化的,其中很多初始化过程并没有使用参数,那么也就是说大部分非内置类型的初始化是依赖于默认构造函数的,但是实际上默认构造函数并不一定是没有参数的,我们知道我们在定义函数的时候是可以在参数表中制定参数的值的,意思用来表达:如果你在使用本函数的时候,在参数表中自己给出了值的话,那就用使用你给定的值,但是如果没有给定的话就用我们在参数表中给出的值。我们看下面的代码:

#include<iostream>
using namespace std;
int main(){
	struct A{
		A(int a,int b){//这个构造函数既不是默认构造函数,也不是复制构造函数,仅仅是普通的构造函数
			a1=a;
			b1=b;
		}
		int a1;
		int b1;
	};
	A u(2,3);
	A u1;//u1无法实现初始化
	cout<<u.a1<<endl;
	return 0;	 
}

  这里为了将其中所有的成员均设为公开,就使用了结构体而没有使用类这种数据结构(实际上在最新的C++标准中,结构体和类的唯一区别就在于仅仅是类中成员的默认公有/私有/保护类型),上述的程序首先是会报错的,原因在于对于u1,需要没有参数或者参数可以指定(在第一段已经说明过的)的构造函数(也就是默认构造函数)中才能得到初始化,而在上面类中的定义中,不仅没有自己定义默认构造函数,而且还给出了其他的构造函数,这使得编译器无法生成合成的默认构造函数(编译器仅仅在类没有声明任何构造函数的时候才会生成一个默认构造函数),那么对于上面这个成语,我们最好的改法就是:

#include<iostream>
using namespace std;
int main(){
	struct A{
		A(int a=3,int b=2){//这个函数是默认构造函数
			a1=a;
			b1=b;
		}
		int a1;
		int b1;
	};
	A u(2,3);
	A u1;
	cout<<u.a1<<endl;
	return 0;	 
}
  我们提到构造函数的时候,最先提到的是默认构造函数和复制构造函数,但是实际上,默认构造函数和复制构造函数最大的区别不过在于在程序员提供任何构造函数的时候,系统不提供合成的默认构造函数而已,而无论程序员在类中加入了任何形式的构造函数,编译器都会提供一个复制构造函数。这种定义更多的时候是为了区分这一点,相比较区别而言,两种构造函数的共同点相比较而言可能更多,毕竟都是用于对象的初始化而不是赋值的。当然,我们平时提到的默认构造函数和复制构造函数提到的形式上的区别依然是:默认构造函数参数列表为空或者像上面的第二段代码一样提供了默认的参数,而复制构造函数我们的定义则是:如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是复制构造函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值