为什么声明构造函数,而不定义它?

sms88 2003-11-29 09:44:48
为什么声明构造函数,而不定义它?
甚至把它声明或定义在私有?
...全文
355 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zero00zero 2003-12-07
  • 打赏
  • 举报
回复
举一个例子:---------------------------------------

// 下面两个类看起来差不多

// 类Xaaaaa在private里声明了两个构造函数和一个赋值操作符重载,但都没有实现
class Xaaaaa
{
public:
// 显式指定大小,explicit目的是不让编译器进行隐式类型转换
explicit Xaaaaa( int nSize ) : m_nSize( nSize )
{
if( m_nSize < 1 )
{
m_nSize = 1;
}
m_pData = new char[m_nSize];
memset( m_pData, 0, m_nSize );
}
// 析构函数
~Xaaaaa()
{
delete []m_pData;
}
// 将数据填充为字符c
void SetValue( char c )
{
memset( m_pData, c, m_nSize );
}
private:
int m_nSize; // 数组的大小
char *m_pData; // 数据

private:
// 以下函数只声明,不实现,为的是限制用法
Xaaaaa(); // 不允许这样用: Xaaaaa *p = new Xaaaaa();
// 不允许这样用: Xaaaaa sample;
Xaaaaa(Xaaaaa&); // 不允许调用拷贝构造函数
Xaaaaa &operator=(Xaaaaa &rhs);// 不允许赋值
};
// 类Xbbbbb与Xaaaaa一模一样,只是没有类Xaaaaa中的私有函数声明
class Xbbbbb
{
public:
// 显式指定大小,explicit目的是不让编译器进行隐式类型转换
explicit Xbbbbb( int nSize ) : m_nSize( nSize )
{
if( m_nSize < 1 )
{
m_nSize = 1;
}
m_pData = new char[m_nSize];
memset( m_pData, 0, m_nSize );
}
// 析构函数
~Xbbbbb()
{
delete []m_pData;
}
// 将数据填充为字符c
void SetValue( char c )
{
memset( m_pData, c, m_nSize );
}
private:
int m_nSize; // 数组的大小
char *m_pData; // 数据
};

// 带有指针成员的类,同时这些指针指向的是实体内容时,赋值操作和拷贝构造函数必须
// 自己实现,如果不想实现就明白地拒绝它们,方法就是将它们声明在private里,但不
// 实现。例如下面FunctionA里的非法调用,编译器会告诉你错了。
void FunctionA()
{
Xaaaaa *pAUnknownSize = new Xaaaaa(); // 编译不通过
pAUnknownSize->SetValue( 'A' );
delete pAUnknownSize;

Xaaaaa *pA = new Xaaaaa( 32 );
pA->SetValue( 'A' );

Xaaaaa A = *pA; // 编译不通过
delete pA;
A.SetValue( 'A' );
...
}
// 假如没有这样做,编译器会为你生成一个你不希望的函数,下面FunctionB这个函数调
// 用,编译可以通过,但运行时就会出错:
void FunctionB()
{
Xbbbbb *pBUnknownSize = new Xbbbbb(); // 没有指定大小,执行默认构造函数
pBUnknownSize->SetValue( 'B' ); // 结果未定义
delete pBUnknownSize;

Xbbbbb pB = new Xbbbbb( 32 );
pB->SetValue( 'B' );

Xbbbbb B = *pB; // 编译器生成的你不希望的赋值操作函数代码执行结果是:
// B.m_nSize = pB->m_nSize;
// B.m_pData = pB->m_pData;
delete pB; // pB->m_pData指向的内存被删除
B.SetValue( 'B' ); // 这时B.m_pData指向的内存是已经被删除的
// 非法区域,运行时就出错了
...
}
以上只是一个简单的例子,希望能说明一些问题。
谁也不敢说自己写的代码一直不会错,要错宁可错在编译时段里。尽量避免运行时错,因为很难找出来,编译器能为我们做查错的工作,就让它去查吧。
dynamic1101 2003-12-01
  • 打赏
  • 举报
回复
由你自己决定要不要定义

程序x人生 2003-11-29
  • 打赏
  • 举报
回复
当声明一个对象时,构造函数便被调用。
你是刚接触c++吧,看到的还是一些简单的类,以后你就会看到构造函数会被定义的(主要是做一些初始化的工作),或是重载基类的构造函数。
看不到定义还有个原因:继承基类的。即该类没有特别的初始化工作要做,基类已替它做了。
短歌如风 2003-11-29
  • 打赏
  • 举报
回复
是为了禁止使用这个构造函数。成员编译器会为你的类“隐含生成”四个特殊成员:
缺省构造函数、
拷贝构造函数、
拷贝赋值操作符、
析构函数。
如果你不想让你的类有这几个成员,就要显式声明它们。由于不需要被调用,所以就不需要定义。
seeknowledge 2003-11-29
  • 打赏
  • 举报
回复
构造函数可以定义的,只是格式与其他函数不同;
class A
{
A(){};
};
它没有返回值,也没有返回值类型;
把它定义为私有,是因为构造函数是系统自动调用的。所以,我们把它通过隐藏机制隐藏;
lovemakec 2003-11-29
  • 打赏
  • 举报
回复
怎么不定义
根据自己的需要吗

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧