Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >构造函数和析构函数

构造函数和析构函数

作者头像
用户7272142
发布于 2023-10-11 13:18:29
发布于 2023-10-11 13:18:29
31700
代码可运行
举报
文章被收录于专栏:Republic博客Republic博客
运行总次数:0
代码可运行

c++要将类像初始化基本类型一样使用类。然而我们前面介绍过C++语言中的结构体,但是类没有办法像结构体一样的初始化 因为结构体的数据成员都是公开的,而类是私有的,因此,只有合适的成员函数,可以将类初始化。一般来说,最好在创建对象时进行初始化。C++提供了一个特殊的成员函数,用于构造新对象,将值赋给数据成员。C++提供声明,又程序员来定义。

声明和定义构造函数

由于本类中有三个数据成员,如果要设置commpany成员,将其他成员设置为0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stock(const string &co,long n = 0,double pr  0.0);
//定义可以这样写
Stock::Stock(const string &co,long n,double pr)
{
    company = co;
    if (n < 0)
    {
        std::cout << "Number of shares can't be negative;"
            << "company " << "share set to 0.\n";
        share = 0;
    }
    else
    {
        share = n;
        share_val = pr;
        set_tot();
    }
}

上述代码和成员函数acquire()相同,区别是,程序声明对象时,将自动调用构造函数。 需要注意的是,构造函数的参数名不可与类成员名称一样,否则会导致混乱。为了避免混乱,常见的作法是在数据成员名中使用m_前缀

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Stock
{
private:
string m_commpany;
long m_shares;
}

也可以加后缀_

使用构造函数

显式调用构造函数 Stock food = Stock("World Cabbage",250,1.25); 这样就初始化food对象的成员

隐式调用构造函数 Stock garment("Furry Mason",50,2.5); 显式调用等价于隐式调用 每次创建类对象,C++都使用类构造函数。 Stock *pstock = new Stock("Bill",18,19.0); 这条语句创建了一个Stock对象,并将其初始化为参数提供的值,并将该对象的地址赋给pstock指针,在这种情况下,虽然对象没有名称,但可以用指针管理该对象。需要注意的是,不同于类方法的是,构造函数由类调用,无法使用对象调用,因为用构造函数初始化对象之前,对象是不存在的。

默认构造函数

默认构造函数是未提供显式初始值时,用来创建对象的构函数,例如 Stock s1;默认构造函数不会进行任何操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stock::Stock();

只创建对象,并不进行初始化,默认构造函数也没有参数。编译器只有在没有定义任何构造函数时,才会提供默认构造函数。为类定义了构造函数后,我们就必须提供默认构造函数,如果只提供了非默认构造函数而没有提供默认构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stock s1;//这种调用默认构造函数将会出错

如果要创建对象且不显式地初始化,则必须定义一个不接受任何参数的默认构造函数,定义默认构造函数的方式有两种

给定构造函数所有参数提供默认值 Stcok(const string &co = "error",int n = 0,double pr = 0.0);

通过函数重载定义另一个构造函数 Stock(); 实际上,默认构造函数应为所有成员提供初始值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stock::Stock()
{
commpany = "no name";
share = 0;
share_val = 0.0;
total_val = 0.0;
}

在设计类时,应提供对所有类成员坐隐式初始化的默认构造函数。 然后就可以进行例如 Stock first; Stock first = Stock(); Stock*first = new Stock;

析构函数

用构造函数创建对象,对应的需要有一个函数做清理工作,这个函数叫析构函数 如果构造函数使用new来分配内存,则析构函数将使用delete清理这些使用完的内存,如果构造函数没有new,那么析构函数也不需要其他操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stock::~Stock();

与构造函数不同的是,析构函数是没有参数的,所以它的原型只能是上面这种情况。什么时候会调用析构函数呢,如果是静态存储类对象,析构函数将会在程序结束后自动调用,如果是new出来的,则当delete时候,会调用析构函数,所以程序必须提供一个析构函数,编译器将隐式地声明一个默认析构函数。 我们可以根据我们学习的函数修改一下我们之前写的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//stock.h
#pragma once
#include<string>
#ifndef  _STOCK_H
#define _STOCK_H
class Stock
{
private:

 std::string company;
 long share;
 double share_val;
 double total_val;
 void set_tot() { total_val = share_val * share; }
public:
 Stock();
 ~Stock();
 Stock(const std::string& co, long n, double pr);
 void buy(long num, double price);
 void sell(long num, double price);
 void update(double price);
 void show();
};
#endif // ! _STOCK_H

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//stcok.cpp
#include<iostream>
#include"stcok.h"
Stock::Stock()
{
 std::cout << "Default cibstructor called\n";
 company = "no name";
 share = 0;
 share_val = 0.0;
 total_val = 0.0;
}
 Stock::Stock(const std::string& co, long n, double pr)
{
 std::cout << "Constructor using " << co << " called\n";
 company = co;
 if (n < 0)
 {
     std::cout << "Number of shares can't be negative;"
         << "company " << "share set to 0.\n";
     share = 0;
 }
 else
 {
     share = n;
     share_val = pr;
     set_tot();
 }
}
 Stock::~Stock()
 {
  std::cout << "bye, " << company << "!\n";

 }
void Stock::buy(long num, double price)
{
 if (num < 0)
 {
     std::cout << "Number of shares purchased can't be negative."
         << "Transcation is aborted.\n";
 }
 else
 {
     share += num;
     share_val = price;
     set_tot();
 }
}
void Stock::sell(long num, double price)
{
 using std::cout;
 if (num < 0)
 {
     cout << "Number if shares sold can't be negative. "
         << "Transcation is aborted.\n";
 }
 else if (num>share)
 {
     cout << "You can't sell more than you have"
         << "Transcation is aborted.\n";
 }
 else
 {
     share -= num;
     share_val = price;
     set_tot();
 }
}
void Stock::update(double price)
{
 share_val = price;
 set_tot();
}
void Stock::show()
{
 std::cout << "Company: " << company
     << "Share: " << share << '\n'
     << "share price: $" << share_val
     << "Total Worth: $" << total_val << '\n';
}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//main.cpp
#include<iostream>
#include"stcok.h"
int main()
{
 using std::cout;
 cout << "Using constructors to create new objects\n";
 Stock s1("NanoSmart",12,20.0);
 s1.show();
 Stock s2 = Stock("Boffo Objects", 2, 2.0);
 s2.show();
 cout << "Assigning stock1 to stcok2:\n";
 //s1.buy(15, 18.125);
 //s1.show();
 s2 = s1;
 cout << "Listing stock1 and stock2:\n";
 s1.show();
 s2.show();
 cout << "Using a constructor to reset an object\n";

 s1 = Stock("Nifty Foods", 10, 50.0);
 cout << "Revised s1:\n";
 s1.show();
 cout << " Done\n";
 
 return 0;

}

输出结果:

说明一下代码 首先用两种方式分别创建了s1和s2俩个对象,第一种通过构造函数初始化对象,第二种,先调用构造函数创建一个临时对象并初始化然后赋值给s2,将一个对象赋给同类型的另一个对象时,C++将源对象的每个数据成员的内容复制到目标对象对应的数据成员中。 构造函数不仅仅可以初始化新对象,还可以给已存在的对象重新赋值,和上面第二种是一样的。main函数调用完之后,会调用析构函数,因为是存储在栈中的对象,所以先进后出,先清理后创建的对象。 我们尽量使用不产生临时对象的方式来初始化对象,会增加程序的效率

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
wordpress面包屑导航简单实现
  前面我们学了一行代码搞定WordPress面包屑导航breadcrumb,现在wordpress文档中有一个简单实现的方法,适用于page页面,有二级分类的情况(Simple breadcrumb trail for pages, two levels deep.),随ytkah一起看看代码
ytkah
2019/08/06
7890
WordPress文章归档页面分组和分页
WordPress 归档页面是一个网站的历史内容存档,它允许用户浏览网站的过去内容。它的存在有以下几个意义:
楚客追梦
2024/08/07
3430
自定义wordpress侧边栏小工具
作者:matrix 被围观: 1,726 次 发布时间:2014-01-25 分类:Wordpress | 4 条评论 »
HHTjim 部落格
2022/09/26
3230
自定义wordpress侧边栏小工具
wordpress代码实现相关文章的几种方法
相关文章分类方法主要有根据文章标签以及文章所属分类来进行区分,以下代码分别使用wordpress自带的query_posts()函数以及直接读取数据库来获取文章的相关文章。另附上获取文章作者的其他文章方法。
子润先生
2021/06/24
5070
WordPress主题下funtions.php的一段“恶意”代码
不多说了,相信有很多WordPresser都知道这段在WordPress主题下fountions.php的“恶意”代码,之所以为“恶意”加个双引号是想说:其实也不算太“恶意”,对你的伤害只是两点:1、感染wp-content\themes\下所有主题的fountions.php文件;2、以当前被感染博客的主页URL为标题和内容,向 livethemas@gmail.com发送邮件。已经知道的就不用往下看啦,还不知道的快去你的主题fountions.php检查有木有,有的话赶快删除之。话说这段恶意代码还真够长
Jeff
2018/01/19
1.2K0
分享WordPress各种标签大全集合 以及如何调用
wordpress程序日渐成熟,开发者越来越多,各种模版层出不穷,但是想要做一个好的wordpress模版,前提不只是要掌握HTML5前端技术,还必须了解wordpress的各种标签如何调用才可以。今天全百科网就把整理的WordPress各种标签以及是如何调用分享给大家。
于飞云计算
2019/07/22
3.3K0
分享WordPress各种标签大全集合 以及如何调用
【Wordpress】ajax 实现站内搜索
最近想给自己的博客实现一个 站内搜索 功能,期望整个过程异步实现。这样用户体验度更好。
redszhao
2021/08/09
1.4K0
【Wordpress】ajax 实现站内搜索
wordpress中提取文章内第一张图片作为缩略图
作者:matrix 被围观: 1,059 次 发布时间:2013-09-04 分类:Wordpress 兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
4640
wordpress中提取文章内第一张图片作为缩略图
wordpress常用函数-随机文章获取和相关文章获取
1、wordpress随机获取文章10篇文章,轻松实现wordpress文章的随机调用;
wordpress建站吧
2019/12/10
9460
Wordpress中文章的特色图像Featured Image究竟存在哪里?
最近项目需要,分析了一下Wordpress的特色图像 Feature Image的上传、保存方式,这一分析觉得Wordpress的数据结构设计还真是有想法。
大江小浪
2019/02/22
1.7K0
Wordpress中文章的特色图像Featured Image究竟存在哪里?
怎样控制wordpress博客首页博文显示内容字数!
爱优博客是用wordpress程序做的,但是默认的wordpress首页博客文章的内容显示很,整个页面显示不了几篇文章,有时写的文章全部都显示在了首页了。
爱游博客
2019/08/07
1.2K0
SEO养博客神器:同步文章(或摘要)到新浪博客的WordPress插件
了解 SEO 的站长都会另外用心做几个博客,起到 SEO 辅助作用。通常说的养博客主要是养 BSP 博客。比如新浪博客,网易博客,百度空间,网易博客,新浪博客,搜狐博客,和讯博客,阿里巴巴博客,博客大巴,天涯博客,豆瓣博客等等。 至于具体做法,自行搜索吧。大致类似于外链推广,引蜘蛛,引流量的做法。我一直感觉精力有限,这样养博客实在是太累了! 一、养博神器 下面就介绍一款懒人养博客的神器:WP2Sinablog。 插件的功能很简单,就是在你发布文章的同时, 会推送一份到新浪博客,无需过多干预就能达到简单的养博
张戈
2018/03/26
1.3K0
SEO养博客神器:同步文章(或摘要)到新浪博客的WordPress插件
wordpress调用文章摘要,若无摘要则自动截取文章内容字数做为摘要
以下是调用指定分类文章列表的一个方法,作者如果有填写文章摘要则直接调用摘要;如果文章摘要忘记写了则自动截取文章内容字数做为摘要。这个方法也适用于调用description标签
ytkah
2019/09/25
1.4K0
WordPress巧用面包屑导航,SEO优化。
什么是网站面包屑导航?面包屑导航意在告知用户所处的当前网页的位置,方便用户可以通过该导航快速返回上一级网页。 面包屑导航一般都在导航的下面,形式一般为 首页 > 一级目录名称 > 二级目录名称 > 目前位置,尽量要把面包屑导航的层次控制在四层以内,这样也有利与搜索引擎蜘蛛一层层往下爬,到了四层以下就很难爬到了。
Kit
2021/08/02
9460
WordPress巧用面包屑导航,SEO优化。
禁用wordpress5.2自动裁剪图片功能
如果你用的是wordpress5.2或以上的版本,系统还会根据你上传的图片裁剪成 scaled 后缀的文件,大小为 2560。 还有其他大小如 2048,1536,768..... 严重浪费磁盘空间不说,还占用性能。
全面屏壁纸
2022/03/01
4330
禁用wordpress5.2自动裁剪图片功能
制作WordPress“带Gravatar头像评论”小工具(集成主题中、含选项)
最近在进一步折腾WordPress 主题的开发,在侧边栏小工具那里想做一个可独立于主题的、类似插件的带头像评论小工具。通过WordPress 官方文档与一些资料大概了解了小工具制作的一些知识,但对于我等PHP 菜鸟,完全自己开发是不可能的;于是在网络上找到了一段代码,分享并备忘一下。 关于WordPress 中小工具的开发,除了WordPress官方文档外,有一篇“阿叔工作室”的文章也不错,点击查看。这里不多说了。 下面的代码得到的“带Gravatar头像评论”小工具可以集成到主题中,小工具后台拥有相关选项
Jeff
2018/01/19
8830
制作WordPress“带Gravatar头像评论”小工具(集成主题中、含选项)
WordPress 插件:“即将推出” Widget
出于维护博客更新频率,或精雕细琢文章时督促自己及时完成,我们会在 WordPress 中把该篇文章设为“定时发布”(Schedule)。如果能在网站显示出这些预定发布的文章,应该会吸引读者继续关注你的博客吧?
Denis
2023/04/15
2610
WordPress发布文章自动同步到新浪微博(带特色图片)
WordPress 发博客后自动同步到新浪微博,这是我从无主题博客看到的方法,一直沿用至今。感觉对博客宣传和提升“逼格”都有显著的作用: 一、老版代码 先来看一下无主题博客分享的代码: functio
张戈
2018/03/23
1.8K0
WordPress发布文章自动同步到新浪微博(带特色图片)
wordpress调用函数大全
WordPress Header头部 PHP代码 (注: 也就是位于<head>和</head>之间的PHP代码)
纯情
2023/04/26
6620
WordPress丨常见函数及拓展模板函数大全
wordpress模板是由PHP语句组成,很多不懂代码的站长都被PHP复杂的代码难倒,难以自己开发个性化的模板。其实想开发一个wordpress模板并不是太难,大家只要了解一些wordpress中的常用函数,即可按照自己的需要进行内容调用了。更高端一点的类似于一些PHP语句的判断等等,这就需要大家自己去学习提高了。本篇文章主要讲解wordpress开发模板中经常需要用到的一些函数。
V站CEO-西顾
2018/06/08
1.9K0
推荐阅读
相关推荐
wordpress面包屑导航简单实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验