C++的简单问题,什么是python 类的析构函数数

扫一扫体验手机阅读
C++构造函数以及析构函数的若干面试问题
Q1:构造函数能否重载,析构函数能否重载,为什么?
A1:函数重载就是同一函数名的不同实现,并且能在编译时能与一具体形式匹配,这样参数列表必须不一样。由于重载函数与普通函数的差别是没有返回值,而返回值不能确定函数重载,所以构造函数可以重载; 析构函数的特点是参数列表为空,并且无返回值,从而不能重载。
class A{public:&A(int n)&{&& cout && "call structor A(int n)." &&&& m_num =&}&&A(const A &a)&{& cout && "Call structor A(const A &a)." &&&}&&virtual ~A()&{&&cout && "Call destructor& ~A()." &&&}&& A& operator=(const A &a)&{&&this-&m_num = a.m_&&return *&}&&private:&int m_};
Q2:析构函数为什么一般情况下要声明为虚函数?
A2:虚函数是实现多态的基础,当我们通过基类的指针是析构子类对象时候,如果不定义成虚函数,那只调用基类的析构函数,子类的析构函数将不会被调用。如果定义为虚函数,则子类父类的析构函数都会被调用。
class B:public A{&public:&& B(int n):A(n)&& {&&cout && "call structor B(int n)." &&&& }&& && ~B()&& {&&cout && "Call destructor ~B()." &&&& }&};
void main(void){&A *pa = new B(10);&}
call structor A(int n).call structor B(int n).Call destructor ~B().Call destructor& ~A().
修改calss A的析构函数,如下:
&~A()&{&&cout && "Call destructor& ~A()." &&&}
如果非虚函数,输出为:
call structor A(int n).call structor B(int n).Call destructor& ~A().
Q3:什么情况下必须定义拷贝构造函数?
A3:当类的对象用于函数值传递时(值参数,返回类对象),拷贝构造函数会被调用。如果对象复制并非简单的值拷贝,那就必须定义拷贝构造函数。例如大的堆栈数据拷贝。如果定义了拷贝构造函数,那也必须重载赋值操作符。
<span type="1" blog_id="324480" userid='
5篇文章,2W+人气,0粉丝
大数据时代的微服务之路
¥51.00414人订阅
<span type="1" blog_id="324480" userid='以下试题来自:
单项选择题以下有关C++析构函数的叙述中,不正确的是()。
A.析构函数名必须以字符~开头
B.不可定义析构函数的形式参数
C.析构函数由系统自动调用
D.可以重载析构函数
为您推荐的考试题库
你可能感兴趣的试题
A.静态数据成员不能被成员函数调用
B.静态数据成员要在构造函数内初始化
C.静态数据成员必须为公有的
D.静态数据成员为该类的所有对象所共有的
A.文本信息在计算机中存储时,汉字均为双字节编码,非汉字字符均为单字节编码
B.文本输入可以是键盘输入,也可以是联机手写输入、语音输入等
C.DOC文档、HTML网页、PDF文档均为丰富格式文本,但它们的格式标记方式不同
D.文本中的字符可以使用不同的字体,不同字体的同一个汉字,其机内码相同
A.数字有线电视采用光纤同轴电缆混合网.其主干线部分采用光纤连接到&小区&
B.数字有线电视网络依赖于时分多路复用技术
C.借助数字有线电视网络接入因特网.需要专用的Cable MODEM或互动式机顶盒
D.借助数字有线电视网络接入因特网的多个终端用户共享连接段线路的带宽
热门相关试卷
最新相关试卷简单介绍C++编程中派生类的析构函数
转载 &更新时间:日 16:08:43 & 投稿:goldensun
这篇文章主要介绍了C++编程中派生类的析构函数,析构函数平时一般使用较少,需要的朋友可以参考下
和构造函数类似,析构函数也是不能被继承的。
创建派生类对象时,构造函数的调用顺序和继承顺序相同,先执行基类构造函数,然后再执行派生类的构造函数。但是对于析构函数,调用顺序恰好相反,即先执行派生类的析构函数,然后再执行基类的析构函数。
请看下面的例子:
#include &iostream&
A(){cout&&"A constructor"&&}
~A(){cout&&"A destructor"&&}
class B: public A{
B(){cout&&"B constructor"&&}
~B(){cout&&"B destructor"&&}
class C: public B{
C(){cout&&"C constructor"&&}
~C(){cout&&"C destructor"&&}
int main(){
运行结果:
A constructor
B constructor
C constructor
C destructor
B destructor
A destructor
从运行结果可以很明显地看出来,构造函数和析构函数的执行顺序是相反的。
需要注意的是,一个类只能有一个析构函数,调用时不会出现二义性,所以析构函数不需要显式地调用。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具C++类成员构造函数和析构函数顺序示例详细讲解
转载 &更新时间:日 10:09:22 & 作者:
这篇文章主要介绍了C++类成员构造和析构顺序示例,看了这个例子大家就可以明白c++构造析构的奥秘
对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。C++遵循如下的创建顺序:
(1)如果某个类具体基类,执行基类的默认构造函数。
(2)类的非静态数据成员,按照声明的顺序创建。
(3)执行该类的构造函数。
即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数。
下面看一个例子吧
代码如下:class c{public:&&& c(){ printf("c\n"); }protected:private:};
class b {public:&&& b(){ printf("b\n");}protected:&&& c C;private:};
class a : public b{public:&&& a(){ printf("a\n"); }protected:private:};
int main(){&&& a A;&&& getchar();}
分析一下吧& 首先定义了3个类 a b c,其中a继承自b ,在main函数里面构造a ,因为a是继承b ,所以会先构造b,然后b类又有一个成员c类,所以c类是最先构造的,然后是b ,最后才是a。
在看一个例子,就是上面的该了一下:
代码如下:class c{public:&&& c(){ printf("c\n"); }protected:private:};
class b {public:&&& b(){ printf("b\n");}protected:private:};
class a : public b{public:&&& a(){ printf("a\n"); }protected:&&& c C;private:};
int main(){&&& a A;&&& getchar();}
没有改变多少,只是在a添加了c成员,而b去掉了。
同样是在main里面构造a ,a继承自b,所以先构造b,然后构造a本身的数据成员c,最后才调用的a本身的构造函数。。
这里大家应该明白构造的细节了吧 。。
接下来看析构的顺序:
(1)调用类的析构函数。
(2)销毁数据成员,与创建的顺序相反。
(3)如果有父类,调用父类的析构函数。
也看一个例子吧:
代码如下:class c{public:&&& c(){}&&& ~c(){ printf("c\n"); }protected:private:};
class b {public:&&& b(){}&&& ~b(){ printf("b\n");}protected:private:};
class a : public b{public:&&& a(){}&&& ~a(){ printf("a\n"); }protected:&&& c C;private:};
int main(){&&& a A;&&& return 0;}
其过程是,在main函数结束时,会销毁a,就会先调用a的析构函数,先后销毁a的数据成员c,最后销毁a的父类b。其实就是跟创建时的顺序反了过来。
好了,到这里相信大家已经明白构造析构的奥秘了吧!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
稍有积蓄, 积分 257, 距离下一级还需 243 积分
论坛徽章:0
各位好,由于以前一直用C++写代码,现在有一个纯C的模块,在写的过程中遇到一些疑问,和大家探讨一下,
我们知道,C++的构造和析构函数非常棒,只需要对对象初始化一次,继而即可提供多个访问接口。
现在的问题是,我有一个大对象,初始化的成本很高,同时需要对这个对象提供多个访问接口,
按照最简陋的想法,每个接口中都要对这个对象进行初始化,如果接口调用很频繁,性能是很难接受的。
请C语言程序设计经验丰富的童子们给点意见,多谢了~~
巨富豪门, 积分 20399, 距离下一级还需 19601 积分
论坛徽章:0
c++ new 的时候做了两件事的, 一个是构造对象, 另一个是初始化变量,
c 得malloc 一下, 然后调用自定义函数 init();
你的描述我不能理解,?
家境小康, 积分 1574, 距离下一级还需 426 积分
论坛徽章:0
搞个变量记录下是否已经初始化过了
大富大贵, 积分 11692, 距离下一级还需 8308 积分
论坛徽章:250
没搞懂为什么“每个接口中都要对这个对象进行初始化”
巨富豪门, 积分 26754, 距离下一级还需 13246 积分
论坛徽章:15
本帖最后由 yulihua49 于
21:17 编辑
各位好,由于以前一直用C++写代码,现在有一个纯C的模块,在写的过程中遇到一些疑问,和大家探讨一下,
insnowind 发表于
static int initflg=0;
static pthread_mutex_t my_mut={.....INITIAL.....};
void my_init()//构造函数
if(!initflg) {
& &pthread_mutex_lock(&my_mut);
& && &if(!initflg)&&{//可能多个人闯入
& && && && &&&initflg++;
& && && && &&&init_data();
& && && && &&&initflg++;
& & pthread_mutex_unlock(&my_mut);
& &&&while(initflg==1) usleep(10000);
这是在C中仿对象的基本方法。一个对象封装在一个文件里。有构造函数,析构函数。
还有set_XXX(),get_XXX()的方法。
家境小康, 积分 1655, 距离下一级还需 345 积分
论坛徽章:0
lz看一下singleton
巨富豪门, 积分 26754, 距离下一级还需 13246 积分
论坛徽章:15
lz看一下singleton
独臂剑客 发表于
& & 楼主想要C的singleton
我那个就是。
稍有积蓄, 积分 257, 距离下一级还需 243 积分
论坛徽章:0
楼主想要C的singleton
我那个就是。
yulihua49 发表于
非常感谢。
我的本意不是要模仿C++的语言特性,也不是什么模式,是想了解C编程的一些思想。
您展现的这种方法我也想过了,但这样就会多出一个全局变量(标志位),至少也是文件级static变量。
个人觉得不太优雅,但好像也并无更好的方法,我现在暂时就是这样处理的,再次感谢。
稍有积蓄, 积分 257, 距离下一级还需 243 积分
论坛徽章:0
本帖最后由 insnowind 于
00:15 编辑
& & 一直存在一个观念,永远不要使用全局变量,这在C++中是行得通的。
&&但是在C语言中,个人觉得不太可能,只能尽可能的限制变量的作用域和生存期。
&&今天大概翻了一下linux内核和glibc的源码,里面非局部变量也非常多,
&&但是代码非常优秀,赏心悦目。
论坛徽章:2
本帖最后由 OwnWaterloo 于
00:25 编辑
看了1楼与回复, 依然不明白lz你到底想要什么效果……
#include &x.h&
x由构造函数初始化, 然后其他cpp文件通过#include “x.h”访问x?
这样有初始化顺序问题。
X& x(void);
#include &x.h&
X& x(void) { static X x_; return x_; }
(先不说多线程问题)
其他cpp文件通过 x 函数得到唯一的 x_ 的引用?
这样其实也是有一个编译器插入的隐藏标志位。
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 c 析构函数继承问题 的文章

 

随机推荐