显式构造函数


C++ 为类(Class)提供了许多默认函数。如果自己没有申明,编译器会为我们提供一个copy构造函数

一个copy assignment操作符一个析构函数。此外,如果没有申明任何构造函数,

编译器会为我们申明一个default构造函数。很像下面的Empty类:

class Empty
{
	public:
		Empty();
		Empty(const Empty &rhs);
		~Empty();
		Empty& operator=(const Empty &rhs);
};


就像Effective C++说的,如果不想使用编译器自动生成的函数,就应该明确拒绝。

1.C++中的隐式构造函数

  如果c++类的其中一个构造函数有一个参数(或者多个默认参数),那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。

2.Explicit Constructors显式构造函数

  为了避免上面提到的只有一个参数的构造函数采用的缺省转换操作,在构造函数前,使用Explicit 关键字修饰即可。


隐式构造使用情况1:(一个参数)

#include <stdio.h>  
  
 
class Test
{
	public:
		Test(int a)
		{
		};
		
		~Test()
		{
		
		};


};
  
  
  
int main()  
{  
	// 将int转换为Test类型的对象,就是使用了隐式构造函数。
	// 因为Test中存在一个只有一个参数的构造函数,且参数类型也是int。
	// 如果在构造函数前加explicit ,表示为显示构造函数,
	// 则编译不能通过。因为这时,就没有隐式构造函数啦。
	Test test = 10;
    	return 0;  
}  


隐式构造使用情况2:(多个默认参数)

#include <stdio.h>  
  
 
class Test
{
	public:
		Test(int a = 0, int b = 0, int c = 0)
		{
		};
		
		~Test()
		{
		
		};


};
  
  
  
int main()  
{  
	// 将int转换为Test类型的对象,就是使用了隐式构造函数。
	// 因为Test中存在一个只有一个参数的构造函数,且参数类型也是int。
	// 如果在构造函数前加explicit ,表示为显示构造函数,
	// 则编译不能通过。因为这时,就没有隐式构造函数啦。
	Test test = 10;
    	return 0;  
}  


只能显示调用情况

#include <stdio.h>  
  
 
class Test
{
	public:
	explicit Test(int a)
		{
		};
		
		~Test()
		{
		
		};


};
  
  
  
int main()  
{  
	// 将int转换为Test类型的对象,就是使用了隐式构造函数。
	// 因为Test中存在一个只有一个参数的构造函数,且参数类型也是int。
	// 如果在构造函数前加explicit ,表示为显示构造函数,
	// 则编译不能通过。因为这时,就没有隐式构造函数啦。
	
	// Test test = 10;    // 编译报错
 	Test test(10);        // 正确
    return 0;  
}  









本文转自:

http://www.cnblogs.com/xudong-bupt/p/3671972.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值