会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 EasyC++,继承和动态内存分配!

EasyC++,继承和动态内存分配

时间:2025-11-05 08:28:50 来源:益强数据堂 作者:IT科技 阅读:839次

继承和动态内存分配

今天这篇文章来聊聊继承与动态内存分配。承和

这里面有一个问题,动态当我们的内存基类使用动态内存分配,并且重新定义赋值和复制构造函数,分配这会对派生类的承和实现有什么影响呢?

我们来看两种情况。

派生类不用new

假设基类中使用了动态内存分配:

class baseDMA {  private:      char *label;      int rating;     public:      baseDMA(const char* l="null",动态 int r=0);      baseDMA(const baseDMA& rs);      virtual ~baseDMA();      baseDMA &operator=(const baseDMA& rs); }; 

在这个声明里包含了构造函数、析构函数、内存复制构造函数和重载赋值运算符。分配

现在假设我们从baseDMA派生出了类lackDMA,承和但是动态后者不使用new:

class lackDMA: public baseMDA {    private:      char color[40];     public:      ... }; 

问题来了,我们要不要给lackDMA这个类定义析构函数、内存复制构造函数和赋值运算符呢?分配

答案是不需要。

首先是承和析构函数,这个很好想明白,动态如果我们没有定义析构函数,内存那么编译器会自动定义一个不执行任何操作的默认析构函数。实际上派生类的析构函数往往会在执行一些逻辑之后调用基类的构造函数,因为lackDMA类中的成员不是通过new创建的,因此不需要额外的操作,所以默认析构函数是合适的。网站模板

同样的默认复制构造函数也会执行非new创建成员的复制,所以对于color变量来说是没问题的。并且在派生类当中,默认复制构造函数除了会复制非new创建的成员之外,还会调用基类的复制构造函数来复制父类成员的部分。所以,对于派生类lackDMA来说,我们使用默认的复制构造函数一样没有问题。

赋值也是一样的,默认的赋值运算符也会自动使用基类的赋值运算符来对基类的成员进行赋值。

派生类使用new

我们再来看看派生类当中使用了new的情况。

class hasDMA: public baseMDA {    private:      char *style;     public:      ... }; 

在hasDMA这个类当中,我们添加了一个需要使用new创建的char*成员。在这种情况下,我们就没办法使用默认的函数了,就必须定义显式析构函数、复制构造函数和赋值运算符了,服务器托管我们一个一个来看。

首先是析构函数,派生类的析构函数会自动调用基类的析构函数,所以我们只需要在析构函数当中释放派生类中独有的成员变量即可。

hasDMA::~hasDMA() {     delete []style; } 

然后我们再来看看拷贝构造函数,由于派生类不能访问基类private成员,所以我们需要调用基类的拷贝构造函数。

hasDMA::hasDMA(const hasDMA& hs): baseDMA(hs) {     style = new char[std::strlen(hs.style) + 1];     std::strcpy(style, hs.style); } 

最后是赋值运算符,同样,由于派生类不能访问基类中私有成员,我们也需要借助基类的赋值运算符:

hasDMA &hasDMA::operator(const hasDMA& hs) {     if (this == &hs) return *this;     baseDMA::operator=(hs);     delete []style;     style = new char[std::strlen(hs.style) + 1];     std::strcpy(style, hs.style);     return *this; } 

这当中有一个语句看起来有些奇怪:

baseDMA::operator=(hs); 

这是我们手动显式调用了基类的赋值运算符,我们直接用等于号赋值也有同样的效果:

*this = hs; 

为什么不这么干呢?这是因为编译器在执行的时候会默认调用子类的赋值运算符hasDMA::operator=,从而导致一直递归导致死循环。

所以我们需要手动写明作用域解析符,表明这是调用的父类赋值运算符,而非派生类的运算符,这一点比较隐晦,b2b供应网要千万注意。

(责任编辑:应用开发)

最新内容
推荐内容
  • HTCOneMax拍照表现如何?(探索HTCOneMax相机的功能与性能)
  • 在Deepin上安装SPSS V22 for linux版,并完成破解激活以及解决中文乱问题,其它Linux版本以及SPSS其它版本基本同法。1、下载好IBM.SPSS.Statistics.v22.Linux-EQUiNOX,这个网上到处都是。解压后在终端进入解压好的文件夹,在终端中运行sudo sh ./SPSS_Statistics_22_Lx.bin以运行安装文件。2、选择安装语言为English,中文安装的话会全是乱码。然后按照指示一路NEXT。3、用户名可以随意填写。默认安装的帮助文档是洋文的,需要什么语言的需要自已勾选。4、接下来会询问你需不需要安装Python,默认安装就可以了。安装路径可以更改,一般默认就可以了。5、下面会问你是否注册,这里不勾选。6、按下来会弹出激活页面,无论安装里选什么语言这里都是调用的系统语言,中文的话就是乱码。这里第一项是叫填激活码,第二个是选用临时激活证书,但是只有14天的试用时间,因为网上的激活码都是针对windows的,对于linux版无效,所以选择临时证书,然后下一步,在弹出的页面选择Temple.txt使用临时证书。以后再激活。继续下一步,安装完成后终端中会显示回到当前的目录。7、在终端中运行 cd /opt/IBM/SPSS/Statistics/22/bin进入程序所在目录,然后运行 ./spssclient打开软件,这时已经可以运行SPSS了,不过在弹出的窗口中可以看到使用期只有14天,而且输入中文的话仍然是乱码,下一步需要激活它然后解决中文乱码的问题。8、激活首先需要破解了的注册文件,文件名称为lservrc,在网上搜SPSSv22破解就可以搜到。然后使用root用户权限进入到/opt/IBM/SPSS/Statistics/22/bin目录,将原本的lservrc文件替换为破解以后的即可,再次运行SPSS软件就会发现试用期提示不见了,说明激活成功。9、之所以中文显示为乱码是因为SPSS自带的JRE没有自带中文字体,解决乱码首先要找到一个中文字体,WINDOWS下随便拷一个就可以,也可以随便网上下一个。然后在使用root用户权限在/opt/IBM/SPSS/Statistics/22/bin/JRE/lib/fonts目录下新建fallback目录,然后将中文字体拷到这个目录里面。再次运行SPSS就会发现中文乱码已经解决了。
  • 安装了Ubuntu系统后,默认的是Firefox火狐浏览器,但是很多朋友打开这个默认的浏览器以后,发现默认的主页不是很喜欢,想要自己修改浏览器的主页,但是很多朋友刚入手Ubuntu系统以后,找不到修改和设置主页位置,这里小编介绍下具体的操作方法。1、系统桌面上,这里首先点击左侧的Firefox浏览器打开。2、这时候鼠标点击顶部,找到edit菜单,然后找到首选项Preferences打开。3、general选择中这里Home page,输入自己要设置的主页地址。4、输入自己要设置的主页以后,关闭页面即可,这里上面选择when firefos starts:为show my home page这样就可以了。5、当然我们也可以点击浏览器右上角的按钮,然后出现界面点击Preferences。后面的操作方法是类似的。6、大家可以先打开一个页面后,点击这里的使用当前页面可以快速设置当前页面为自己浏览器的主页。7、主页设置结束后,下次你再次打开Firefox浏览器时候,主页就显示了。
  • 10月13日消息,Ubuntu 15.10(Wily Werewolf)即将在10月22日正式发布,目前Ubuntu 15.10已经确认达成最终内核的冻结,也就是说,今后除了一些bug修复,将不会再有相关升级。具体说来,Ubuntu 15.10进入冻结阶段后,其软件栈和内核都不会再有升级,这能够让开发者更好地进行测试,为最终发布做好准备。据悉,Ubuntu 15.10所用Linux内核为4.2版。来自Canonical的Joseph Salisburty几天前就表示:“我们即在10月8日达成Wily Werewoft内核冻结,若还有针对15.10的补丁,请尽快提交。按照内核冻结的最终期限,所有补丁需要遵守我们的SRU策略,存在错过发布的可能。”
  • 电脑开机报Windows错误的解决方法(应对电脑开机报Windows错误,避免系统崩溃)
  • 通过查看网页源代码可以发现,网页设计师们最常用的是 Windows 平台中的“微软雅黑”、“宋体”等字体。与我在经验“Ubuntu 里为 LibreOffice 设置替换显示字体”中提到的相似的原因,在 Ubuntu 中浏览网页时,由于字体对不上,网页内容一般也都是显示为黑体字,比较单调。除了从 Windows 平台复制字体到 Ubuntu 平台这一方法之外,其实我们可以通过设定字体替换,让网页上常用的“黑体”、“宋体”由 Ubuntu 调用相应的字体显示,让网页外观在两个平台上有近似的显示效果。在 Ubuntu 平台上打开网页,满眼都是黑体字。难道网页设计师就是这样设计的吗?在网页空白处右键,在弹出菜单中点击“查看源代码”(或类似的选项),在其中找到网页 css 链接并打开,可以看到,网页设计师并不是只用“黑体”一种字体。如图,该网页的设计师使用了“黑体”、“宋体”两种字体显示中文。为了让 Ubuntu 平台上浏览网页时,能够看到与网页设计师原始设计接近的效果,我们需要替换字体。软件名称:Font Creator Program v4.1 绿色汉化破解版(字体制作编辑修改工具)软件大小:3MB更新时间:2013-05-131、首先,要安装一款叫做“Font Manager“的软件。Font Manager 安装完成后,点击启动它。待启动完成后,在窗口左侧下方,点击字体设置按钮(上面带有a、b两个字母的按钮)。2、在弹出的菜单中,点选“Alias Editor“。3、弹出 Alias Editor 窗口,点击右侧的 Add Alias (添加字体别名)按钮。4、左侧输入窗口中会出现一个默认字符为“Family”的条目,双击它,并改为“宋体”,然后回车;再点击窗口右侧的 “Add Substitute”(添加字体替换)按钮。5、在上一步骤输入“宋体”的条目下方,会出现默认字符为“Subtitute”的条目,同样双击,改为“AR PL UMing CN”(输入“AR”两个字母后,下方会弹出字体列表,可以从中选择)、回车。6、用同样的方法,输入以下字体及其替换:SimSun——AR PL UMing CN;黑体——Droid Sans Fallback;等等,如图。7、最后点击窗口右下角的“Write configure”(写入配置文件)按钮,窗口关闭,回到 Font Manager 主窗口,在弹出的 Font Manager needs to reload 对话框中,点击“Reload”。8、注销 Ubuntu 登录(注意保存正在编辑的文档)、重新登录。9、再打开第1步骤中打开过的网页,会看到网页字体区分内容,由不同的字体显示不同的内容了。标题由黑体负责显示,内容由宋体负责显示,错落有致,不会视觉疲劳。相关推荐: Ubuntu系统中LibreOffice怎么替换显示字体? ubuntu系统中删除/卸载自行安装的字体的方法
热点内容