如何拒绝编译器为自己声明创建函数(default ctor, copy ctor, dtor, copy assignment)

在http://blog.csdn.net/u012421852/article/details/51172795中,介绍了编译器为一个类“润物细无声”地声明创建的一些函数。

1)默认构造函数

2)拷贝构造函数

3)析构函数

4)拷贝赋值操作符


现在有一个问题,如果CBlueSky就是不想有拷贝赋值操作符,自己没有实现,但是无奈编译器会在使用时为自己声明创建一个拷贝赋值操作符,怎么拒绝编译器的这份好意呢?


比如拒绝编译器为自己提供拷贝构造函数

方法:在CBlueSky中将拷贝构造函数声明为private,编译器不会再为CBlueSky雷锋式声明创建copy constructor,因为编译器只能提供public且inline的函数,这是规则。

还有一个问题,CBlueSkye的member函数和frind class还有权限访问private的copy constructor,对于这个问题,CBlueSkye只声明不定义copy constructor就可以了。


//< BlueSky.h

#ifndef __BLUESKYJOYN_BLUESKY_H_
#define __BLUESKYJOYN_BLUESKY_H_

namespace BlueSkyJoyn {

class CBlueSky {
public:
	CBlueSky(int age);

private:
	CBlueSky(const CBlueSky&);//<只在.h中声明,不在.cpp中定义copy constructor 
	
	int		m_age;
};

}
#endif

//< BlueSky.cpp

#include "BlueSky.h"

namespace BlueSkyJoyn {

CBlueSky::CBlueSky(int age):m_age(age) 
{}

}

int main()
{
	BlueSkyJoyn::CBlueSky a1(25);
<span style="white-space:pre">	</span>
	return 0;
}

这时候

$make BlueSky

可以编译并连接成功生成BlueSky可执行文件。


如果BlueSky的其他member-function或者friend class调用了CBlueSky的copy costructor,这时候由于copy construct只进行了声明而没有定义,就是在mem-fun和friend-class中被调用了,也不会有任何行为。如果在其他非friend-class中调用了CBlueSkey的copy construct,就会产生编译错误。


综上所述:将目标函数在CBlueSky中只声明为private且不定义,可以婉拒编译器的雷锋式声明和创建,在外界使用时发现CBlueSky不提供此目标函数接口功能。


实现只在stack上生成对象和只在heap上生成对象用到了此思想,后续用博客记录下如果只在stack/heap上生成对象的类设计。

你可能感兴趣的:(如何拒绝编译器为自己声明创建函数(default ctor, copy ctor, dtor, copy assignment))