c++学习之对象和类——构造函数和析构函数
再认真理一遍~
0.类
这里先来定义一个类,便于后面的理解。参考C++ Primer Plus
class Stock
{
private:
std::string company;
long shares;
double share_val;
double total_val;
void set_tot(){total_val = shares * shares_val;}
public:
//这里是函数声明,不是重点就不写了
}
1. 构造函数
(1)作用
在C++ Primer Plus里引出构造函数这个概念的是对类对象的初始化。由于类对象中数据部分的访问状态通常是私有的,因此不能像int year = 2019这样对类对象中的company、shares、share_val初始化,而只能通过成员函数来访问数据。于是我们会想,那就写一个成员函数嘛,每次创建对象时调用它就好啦~~
是的,C++就提供了这样一个特殊的成员函数——类构造函数,专门用于构造新对象、将值赋给他们的新成员!这里就提到了构造函数的第二个作用当然应该是最重要的作用——创建对象。
C++在创建类对象时,会自动调用它,是不是很方便!
(2)声明和定义构造函数
① 声明
在这里,我们可以只设置company的值,让其他默认为0,那么我们的构造函数声明可以长这样:
Stock(const string & co,long n = ,double pr = 0.0);
② 定义
下面是一种可能的定义:
Stock(const string & co,long n,double pr)
{
company = co;
shares = n;
share_val = pr;
set_tot();
}
注:构造函数的参数表示的不是类成员,而是赋给类成员的值,因此参数名不能与类成员名相同哦。
Stock(const string & company,long shares,double share_val)//NO!!!不可以这样,不然就是shares = shares
{
...
}
(3)使用构造函数
C++提供了两种使用构造函数来初始化对象的方式——显式调用和隐式调用。
① 显示地调用构造函数
Stock food = Stock("GOO",,);//将food对象的company设置为"HUA",将shares成员设置为250,将shares_val设置为250
② 隐式地调用构造函数
Stock food("GOO",250,250); //这和上面的方面是等价的
ps:下面是与new一起使用的方法
Stock *pstock = new Stock("GOO",,);//这条语句创建一个Stock对象,并将该对象的地址赋给pstock指针。
注:无法使用对象来调用构造函数,因为对象就是构造函数创建的,在构造函数创建对象之前,对象是不存在的。(构造函数不能是虚函数,后面理解)
(4)默认构造函数
Stock cat; //这种情况下,未提供显式初始值,系统调用默认构造函数。就和int a;但没有提供初始值一样。默认构造函数可能为Stock::Stock(){ }.
但是,这种情况是有前提的:
① 当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。(要么一个都没有)
② 若定义了非默认构造函数,那必须为他提供默认构造函数。(要么两个都有)
定义默认构造函数的方式有两种:
Stock(const string & co = "Errer",int n=,double pr = 0.0);//给已有构造函数的所有参数提供默认值
Stock();//通过函数重载来定义一个没有参数的构造函数
2.析构函数
书上说“对象过期时,程序将自动调用一个特殊的成员函数,该函数的名称令人生畏——析构函数”。。。hhhh笑死~你可是一本正经书丫。
(1)作用
析构函数完成清理工作,如果构造函数用new来分配内存,则析构函数将使用delete来释放内存。没有使用new,那么析构函数实际上没有需要完成的任务,只要让编译器生成一个隐式析构函数即可。
(2)形式
在构造函数前加“~”,如“~Stock”。
什么都不做时,可以这样定义:
Stock::~Stock()
{
//也可以在里面加一点东西,方便看在何时调用,如 cout << "Bye~" << endl;
}
(3) 调用时机
由编译器决定,通常不应再代码中显式调用:
① 如果创建的时静态存储对象,则其析构函数将在程序结束时自动调用。
② 如果创建的时自动存储类对象(像前面实例那样),则其析构函数将在程序执行完代码块时自动被调用。
③ 如果对象是new创建的,则它将驻留再栈内存或自由存储区中,当使用delete来释放内存时,其析构函数将自动调用。
注:类对象过期时析构函数将自动被调用,因此必须有一个析构函数。如果程序员没有提供,那么编译器将隐式地声明一个默认析构函数,并在发现导致对象被删除地代码后,提供默认析构函数地定义。
c++学习之对象和类——构造函数和析构函数的更多相关文章
- php面向对象学习笔记01-面向对象介绍、构造函数、析构函数
偶尔翻看以前的笔记.就整理下.方便以后的查阅 类-成员属性 成员属性是从某个事务提取出来的, 可以是基本数据类型,也可以是复合数据类型(数组,对象) //创建一个类 class Cat{ pubic ...
- Java 学习:对象和类
对象和类 从认识的角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的,是对对象的抽象. 从代码运行角度考虑是先有类后又对象.类是对象的模板. 对象:对象是类的一个实例,有状态和行为. 类:类是 ...
- 4月11日 python学习总结 对象与类
1.类的定义 #类的定义 class 类名: 属性='xxx' def __init__(self): self.name='enon' self.age=18 def other_func: pas ...
- C++ 派生类构造函数和析构函数
几个问题 一个类的各数据成员的构造顺序? 按他们在类定义中出现的先后顺序:先定义者先构造. 类的对象成员的构造函数与类自身的构造函数的执行顺序? 先执行对象成员的构造函数,再执行类自身的构造函数. 构 ...
- C++类构造函数、析构函数运行机理
http://blog.sina.com.cn/s/blog_6fd68d5f0100n60h.html 前言--构造函数.析构函数的简单理解:1)构造函数---对象被创建时候调用的函数:2)析构函数 ...
- 重新学习Java——对象和类(一)
之前通过记笔记的方法,对于<Java核心技术>这本书的前一章进行了重新的复习,感觉效果很好,比单独看书带来了更好的复习效果,了解了很多以前不是很注意的一些细节,但是在一些自己较为熟悉的地方 ...
- <java基础学习>JAVA 对象和类
Java is an Object-Oriented Language. As a language that has the Object Oriented feature, Java suppor ...
- 重新学习Java——对象和类(二)
上一节回归了如何以面向对象的思想去使用一些Java中的公共类,也设计了一些自己的类并介绍了设计类的基本方法和技巧,这一节我们将继续回顾这些内容,并争取从中获得新的体验和感受. 1. 静态域与静态方法 ...
- Objective-C学习笔记---构造函数和析构函数
简单的讲,构造函数就是在创建一个对象的时候起到初始化的作用,对这个对象里的一些成员变量进行初始化,析构函数就是在对象被删除进行一些清理工作,也就是专门的扫尾工作,下面用代码来进行具体说明. 一.构造函 ...
随机推荐
- 关于web前端开发,区别用户使用的终端设备代码
对web前端开发,熟知不同的浏览器,的解析是基本技能,下面,我就向大家展示一下,如何获得当前用户所用的终端设备.车子一发动,请准备上车................... <script> ...
- TCP之连接的建立和终止
1. 连接的建立 TCP 连接建立的三次握手 如上图所示,TCP 连接的建立会发生如下述情形: 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这 3 个函数 ...
- 我的Linux vim配置文件
map <F9> :call SaveInputData()<CR> func! SaveInputData() exec "tabnew" exec 'n ...
- 安装RabbitMq,写程序发送接收消息
1.安装Erlang和RabbitMq 在安装RabbitMq之前需要安装的Erlang(esl-erlang_22.0_windows_amd64.exe): https://pan.baidu.c ...
- T89359 扫雷
T89359 扫雷 题解 朴素做法:暴力出奇迹 一维数组按道理不能开到1e7这么大吧,但是我开了井然 A 了 或许是rp问题 #include<iostream> #include< ...
- 前端Ajax跨域解决方案
业务场景: 前后端分离需要对接数据接口. 接口测试是在postman做的,今天才开始和前端对接,由于这是我第一次做后端接口开发(第一次嘛,问题比较多)所以在此记录分享我的踩坑之旅,以便能更好的理解,应 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_2_01传统架构演进到分布式架构
笔记 第二章 架构演进和分布式系统基础知识 1.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 (画图) 高可用 LVS+keepalive :负载均衡的知识点 1. ...
- 190628 - 解决新版本LastPass没有谷歌套件时打开就闪退的问题.md
目录 解决新版本LastPass没有谷歌套件时打开就闪退的问题 可用解决方案 可用解决方案3 可用解决方案2 可用解决方案1 尝试安装 碰到的问题列表 问题现象 解决新版本LastPass没有谷歌套件 ...
- Python 自动化
一.Win32 GUI自动化测试模块: 1. pywinauto: 下载链接:http://sourceforge.net/projects/pywinauto/ 在线文档:http://pywina ...
- centos升级glibc2.23编译安装
wget http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gz tar -zxvf glibc-2.23.tar.gz cd glibc-2.23 mkdir ...