C++基础第三章(使用类和对象)上篇(类的构造函数和析构函数)
利用构造函数对类对象初始化
在类内如果数据成员是公有的则可以在类内直接进行初始化
#include<iostream>
using namespace std;
class Time
{public :int hour = 1;int minute = 0;int sec = 0;
};int main()
{Time t1;cout << t1.hour << endl;return 0;
}
或者这样
#include<iostream>
using namespace std;
class Time
{public :int hour;int minute;int sec;
};int main()
{Time t1 = {1, 1, 1};cout << t1.hour << endl;return 0;
}
上述初始化是从上到下,从左到右对应的,有顺序。
但是如果数据成员是 private 或者是 protected;就不能再这样初始化
#include<iostream>
using namespace std;class Time
{private:int hour = 0; //错误,私有数据成员
};int main()
{Time t1 = {1}; //或者这样都是错误的 return 0;
}
一.1 , 构造函数实现数据成员的初始化
构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用,而是在建立对象时自动执行
构造函数的名字必须与类名相同。
#include<iostream>
using namespace std;class Time
{public:Time(){hour = 0;sec = 1;minute = 0;}void set_time();void show_time();private:int hour;int minute;int sec;
};void Time::set_time()
{cin >> hour >> minute >> sec;
}
void Time::show_time()
{cout << hour << " : " << minute << " : " << sec << endl;
}int main()
{Time t1, t2;t1.set_time();t1.show_time();t2.show_time();return 0;
}
类外定义类内声明 Time();
Time::Time()
{hour = 0;sec = 1;minute = 0;
}
构造函数不能被调用,可以使用一个类的对象初始化另一个对象
Time t1;
t1.Time(); //不能调用构造函数Time t2 = t1; //一个类对象可以初始化另一个类对象
一.2 , 带参数的构造函数
Time(int, int, int); //类内声明Time::Time(int h, int m, int s) //类外定义
{hour = h;minute = m;sec = s;
}Time t1(5, 5, 5); //传参
Time(int h, int m, int s) //类内定义
{hour = h;minute = m;sec = s;
}
一.3,用参数初始化表对数据成员初始化
参数初始化表
Box::Box(int h, int w, int len):heigh(h), width(w), length(len){}
带有参数初始化表的构造函数的一般形式如下:
类名::构造函数名( [ 参数表 ] )[ :成员函数初始化表 ]
{
[ 构造函数体]
}
如果数据成员是数组,则应当在构造函数的函数体中用语句对其赋值,而不能在参数初始化表中对其初始化。
#include<iostream>
#include<stdio.h>
#include<string.h>using namespace std;
class Student
{public:Student(int n, char s,char nam[]):num(n), sex(s){strcpy(name,nam);}void show(){cout << name << endl;}private:int num;char sex;char name[20];
};int main()
{Student stud1(1111, 'm', "WangLin");stud1.show();return 0;
}
一.4,构造函数的重载
class Box
{public:Box();Box(int h, int w, int len):height(h), width(w), length(len){}private: int height;int width;int length;
};Box::Box()
{height = 10;width = 11;length = 5;
}
Box(int); //有一个参数的构造函数
Box(int, int); //有两个参数的构造函数
在建立对象时不必给出实参的构造函数,成为默认构造函数(default constructor),显然无参构造函数是默认构造函数,一个类只能有一个默认构造函数。如果用户没有定义,系统会自动定义,但是它的函数体是空的,不起初始化的作用。如果你想要有初值,就需要自己初始化。
一.5,使用默认参数的构造函数
class Box
{public:Box(int h = 10, int w = 10, int len = 10);private: int height;int width;int length;
};Box::Box(int h, int w, int len):height(h), width(w), length(len){}int main ()
{Box box1; //不传递参数 Box box2(10); //只传递一个参数 Box box3(10, 15); //传递2个参数 Box box4(10, 15, 30); //传递3个参数
}
在声明构造函数时,形参名字可以省略
Box(int = 10, int = 5, int = 6)
下面给出不能进行重载的例子
Box()
Box(int = 10, int = 5, int = 6)
原因:默认构造参数只能有一个,上面是错误的
Box()
Box(int = 10, int = 5, int = 6)
Box(int ,int)Box box1; //是调用1还是2?
Box box2(10, 5); //是调用2还是3?
原因:在一个类中定义了一个全部是默认构造后,不能在定义重载构造函数
Box()
Box(int , int = 5, int = 6)
Box(int ,int)Box box1(10, 5); //错误,出现歧义性
一.6,利用析构函数进行清理工作
析构函数的作用: 并不是删除对象,而是在撤销对象占用对象的内存之前完成一些清理工作,使这部分内存可以被程序分配给新的对象使用。程序设计者要事先设计好析构函数,已完成所需功能,只要对象生命期结束,程序就会自动执行函数完成这些工作
当对象的生命期结束,会自动执行析构函数、
(1) 如果在一个函数中定义了一个对象(假设是自动局部对象),当这个函数被调用结束时,对象应该被释放,在对象释放前自动执行析构函数。
(2)静态(static)局部对象在函数调用结束时对象并不释放,因此也不调析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对对象的析构函数。
(3)如果定义一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数)时,调用该全局对象的析构函数。
(4)如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数
析构函数不返回任何值,没有函数类型,也没有函数参数,不能被重载,一个函数可以有多个构造函数,但是析构函数只能有一个。
并且析构函数的用不值是释放资源,还可以用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。你也可以在析构函数内写函数 调用数据。
如果用户没有定义析构函数c++ 编译系统会自动生成但是它只是徒有其名,什么操作都不进行,想让析构函数完成任何工作都必须在定义的析构函数内指定。
#include<iostream>
#include<string>
using namespace std;
class Student
{public:Student(int , string , string);~Student(); //析构函数void display();private:int num;string name;string sex;
};
Student::Student(int n, string nam, string s)
{num = n;name = nam;sex = s;cout << "Constructor called." << endl;
}
Student::~Student()
{cout << "Destructor called." << num << endl;
}
void Student::display()
{cout << "number = " << num << endl;cout << "name = " << name << endl;cout << "sex = " << sex << endl;
}
int main(){Student stud1(1001,"小明","man");stud1.display();Student stud2(1002,"小芳","woman");stud2.display();
}
发现析构函数执行的顺序了么?
调用构造函数和析构函数的顺序
先构造的后析构,后构造的先析构
(1)如果在全局范围中定义对象(就是函数外),他的构造函数在本文件中所有函数执行前调用,但是一个程序若包含很多个文件,而不同的文件中有定义了全局对象,则他们执行构造函数的顺序不确定。他们都是在main执行完毕或调用exit函数时调用析构函数。
(2)如果定义的是局部自动对象(在函数内定义),则在建立对象时调用其构造函数。如果对象所在函数被多次调用,则每次建立对象时都要调用构造函数,在函数调用结束时,对象释放时调用析构函数。
(3)如果定义静态(static)局部对象,则只在程序第一次调用此函数定义对象时调用构造函数一次即可,在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数调用结束或exit函数结束时调用。
例子
void funtion()
{Student stud1;static Student stud2;}
当调用到funtion函数时,先建立对象stud1,然后执行stud1的构造函数,然后建立对象stud2,然后执行stud2的构造函数。当funtion函数执行完后,调用stud1的析构函数,而stud2是静态局部对象在funtion结束后并不释放对象.直到整个程序结束时stud2才释放,执行析构函数。
C++基础第三章(使用类和对象)上篇(类的构造函数和析构函数)相关推荐
- 3-2:类与对象上篇——类的对象模型和计算类的大小以及this指针问题
文章目录 一:类对象模型 (1)如何计算类对象的大小 (2)类对象的存储方式 二:this指针 (1)一个问题 (2)this指针 (3)this指针存在哪里? 一:类对象模型 (1)如何计算类对象的 ...
- 大学计算机基础第五版第三章,大学计算机基础第三章习题答案
<大学计算机基础第三章习题答案>由会员分享,可在线阅读,更多相关<大学计算机基础第三章习题答案(4页珍藏版)>请在人人文库网上搜索. 1.第三章 微型计算机硬件组成1.微型计算 ...
- 计算机基础课件第三章ppt,计算机应用基础第三章3.4.ppt
文档介绍: 3.4 使用网络服务 本节主要学****内容: 掌握即时通信软件QQ的安装与使用; 2. 开通与使用博客或微博; 3. 使用常用的网络服务,如网上存储数据.网上求职或购物 村僧弄锄蔓很卒河 ...
- 计算机中的表示方法,计算机应用基础第三章计算机中信息的表示方法
<计算机应用基础第三章计算机中信息的表示方法>由会员分享,可在线阅读,更多相关<计算机应用基础第三章计算机中信息的表示方法(17页珍藏版)>请在人人文库网上搜索. 1.第第三三 ...
- Pytho基础 第三章
Python基础 第三章 函数 3.1 概念整理 3.1.1 def语句和参数: 在调用print()或 len()等函数时,会传入一些值放于括号中间,在此称为参数.也可以自行定义接收参数的函数. d ...
- Java_面向对象基础(类、对象、方法和构造函数)
Java的面向对象基础(类.对象.方法和构造函数) 面向对象的基本概念 面向对象的设计思想 什么是类 什么是对象 类的定义 设计面向对象的例子 步骤一:设计动物这个类 步骤二:创建具体的动物 步骤三: ...
- java类与对象_Java类与对象
类与对象 1,面向对象编程简介 Java语言最大的特点在于面向对象的编程设计,并且面向对象的编程设计也在由于Java自身的发展而不断发展.面向过程编程(C语言).函数式编程(Scala).面向对象编程 ...
- 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用
实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...
- C++ 类与对象_类的其他成员(常成员,静态成员,友元)
系列文章目录 重新复习c++,所以把书中的重点内容整理成博客,尽量简洁,易懂. C++ 类与对象_类和对象的定义与访问 (定义类和对象,访问对象成员,this指针) C++ 类与对象_构造函数和析构函 ...
- php函数、类和对象以及类的封装、继承、类的静态方法、静态属性
php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 ...
最新文章
- python加载shellcode免杀 简介
- nginx openresty content_by_lua_file 404错误
- matlab冲击噪声,如何用MATLAB生成噪声和冲击混合信号
- python 文件分割 按大小_python处理分隔大文件
- yum 安装mysql 启动_linux(centos6.9)下使用yum安装mysql,及启动MySQL等
- Google AppEngine:任务队列API
- 【啃不完的算法导论】- 动态规划 - 最长公共子序列(概念篇)
- 学习云计算前景如何?2020年Linux运维职业选择有哪些?
- 如何判断过拟合和欠拟合
- QuickGUI编辑器系列---从文件中读取并解析
- 九度OJ 1255:骰子点数概率 (递归、DP)
- Oracle执行计划使用分析SQL执行效率
- Windows 10 Build 16226发布:任务管理器新增GPU追踪
- 【量化笔记】动量Momentum相关技术指标以其含义
- python基础螺旋线
- 成功解决Fatal error in launcher: Unable to create process using ‘“…python.exe“ “…jupyter.exe“ notebook‘
- 安装centos6.5没有网,右上角也没有网络图标
- C++编程第一课《编程是一门技术——认识C++》
- 微信开发系列 — — 微信模板消息
- 中职计算机教师试讲技巧,中职教师资格试讲-20210628154146.docx-原创力文档
热门文章
- 关于使用export和import的2个报错
- 需求分析怎么写:Volere版需求规格说明书
- Retrofit 基础+详解
- _blank 和 _self的区别以及display:none和visibility:hidden的区别
- 工业企业外购材料退货、折让进项税额的会计处理
- 南邮 | Linux实验五:Linux/C 开发环境 gcc 编译和 make 项目管理
- eureka集群read timeout异常
- wpa_supplicant介绍【转】
- SMB 获取系统信息与SSH与FTP服务识别
- wiringPi库API大全