社区
C++ 语言
帖子详情
为什么声明构造函数,而不定义它?
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
打赏
举报
回复
怎么不定义
根据自己的需要吗
最全的C和C++语言笔试面试题汇总
最全的C和C++语言笔试面试题汇总,我大四时候找工作时候他帮上了很多忙,里面的题目经常考到。希望对大家有帮助。
构造函数
为什么一般不
定义
为虚函数?而析构函数一般写成虚函数的原因 ?
1、
构造函数
不能
声明
为虚函数 1)因为创建一个对象时需要确定对象的类型,而虚函数是在运行时确定其类型的。而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型,是类本身还是类的派生类等等 2)虚函数的调用需要虚函数表指针,而该指针存放在对象的内存空间中;若
构造函数
声明
为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数即
构造函数
了 2、析构函...
为什么
构造函数
不能
声明
为虚函数?
构造函数
不能
声明
为虚函数,析构函数可以
声明
为虚函数,而且有时是必须
声明
为虚函数。
构造函数
不能
声明
为虚函数的原因是: 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。 2 虚函数的执行依赖于虚函数表。而虚函数表在
构造函数
...
为什么
构造函数
不能是虚函数?析构函数可以是虚函数吗?
构造函数
不能
声明
为虚函数,析构函数可以
声明
为虚函数,而且有时是必须
声明
为虚函数。 抽象类中构造和析构均不能使用纯虚函数。 为什么
构造函数
不能
声明
为虚函数呢? 1、构造一个对象的时候,必须知道对象的实际类型,而虚函数是在运行期间确定实际类型的。如果
构造函数
为虚函数,则在构造一个对象时,由于对象还未构造成功,编译器还无法知道对象的实际类型,是该类本身还是派生类。无法确定。 2、虚函数的执行依赖于虚函数表,而虚函数表是在
构造函数
中初始化的,即初始化vptr,让它指向虚函数表。如果
构造函数
为虚函数,则在构造
构造函数
和析构函数可以是虚函数吗?为什么?
三、
构造函数
和析构函数可以是虚函数吗?为什么? 1、
构造函数
从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果
构造函数
是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以
构造函数
不能是虚函数。 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。
构造函数
本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以
构造函数
没有
C++ 语言
65,186
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章