C++语言基础(4)-构造函数和析构函数
一.构造函数
类似于java,C++中也有构造函数的概念,相关用法如下:
1.1 构造函数的定义
#include <iostream>
using namespace std; class Student{
private:
char *m_name;
int m_age;
float m_score;
public:
//声明构造函数
Student(char *name, int age, float score);
//声明普通成员函数
void show();
}; //定义构造函数
Student::Student(char *name, int age, float score){
m_name = name;
m_age = age;
m_score = score;
}
//定义普通成员函数
void Student::show(){
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
} int main(){
//创建对象时向构造函数传参
Student stu("小明", , 92.5f);
stu.show();
//创建对象时向构造函数传参
Student *pstu = new Student("李华", , );
pstu -> show(); return ;
}
运行结果:
小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是96
1.2 构造函数的重载
构造函数同样也支持重载操作:
#include <iostream>
using namespace std; class Student{
private:
char *m_name;
int m_age;
float m_score;
public:
Student();
Student(char *name, int age, float score);
void setname(char *name);
void setage(int age);
void setscore(float score);
void show();
}; Student::Student(){
m_name = NULL;
m_age = ;
m_score = 0.0;
}
Student::Student(char *name, int age, float score){
m_name = name;
m_age = age;
m_score = score;
}
void Student::setname(char *name){
m_name = name;
}
void Student::setage(int age){
m_age = age;
}
void Student::setscore(float score){
m_score = score;
}
void Student::show(){
if(m_name == NULL || m_age <= ){
cout<<"成员变量还未初始化"<<endl;
}else{
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
} int main(){
//调用构造函数 Student(char *, int, float)
Student stu("小明", , 92.5f);
stu.show(); //调用构造函数 Student()
Student *pstu = new Student();
pstu -> show();
pstu -> setname("李华");
pstu -> setage();
pstu -> setscore();
pstu -> show(); return ;
}
运行结果:
小明的年龄是15,成绩是92.5
成员变量还未初始化
李华的年龄是16,成绩是96
1.3 默认构造函数
类似于java,如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的。
注意:调用没有参数的构造函数也可以省略括号。
Student *stu = new Student;
Student *stu = new Student();
以上两种写法是等价的。
1.4 构造函数的参数初始化表
构造函数的主要目的是用于对成员变量进行初始化, 为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用参数初始化表。具体写法如下:
#include <iostream>
using namespace std; class Student{
private:
char *m_name;
int m_age;
float m_score;
public:
Student(char *name, int age, float score);
void show();
}; //采用参数初始化表
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){
//TODO:
}
void Student::show(){
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
} int main(){
Student stu("小明", , 92.5f);
stu.show();
Student *pstu = new Student("李华", , );
pstu -> show(); return ;
}
运行结果:
小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是96
1.5 使用参数初始化表来初始化const成员变量
参数初始化表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用参数初始化表。例:
class VLA {
private:
const int m_len;
int *m_arr;
public:
VLA(int len); }; VLA::VLA(int len):m_len(len) {
m_arr = new int[len];
}
二.析构函数
创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存、关闭打开的文件等,这个函数就是析构函数。
析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~
符号。
注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。
class VLA {
public:
VLA(int len);
~VLA(); // 析构函数
private:
const int m_len;
int *m_arr;
}; VLA::VLA(int len):m_len(len) { // 构造函数初始化
if (len > ) {m_arrz = new int[len];};
else {m_arr = NULL;};
} VLA::~VLA() {
delete []m_arr; // 在析构函数中释放堆区申请的内存
}
C++ 中的 new 和 delete 分别用来分配和释放内存,它们与C语言中 malloc()、free() 最大的一个不同之处在于:用 new 分配内存时会调用构造函数,用 delete 释放内存时会调用析构函数。构造函数和析构函数对于类来说是不可或缺的,所以在C++中我们非常鼓励使用 new 和 delete。
C++语言基础(4)-构造函数和析构函数的更多相关文章
- 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数
Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...
- C++基础学习9:构造函数和析构函数
1. 构造函数用来对类对象进行初始化,它完成对内存空间的申请.赋初值等工作. 2. 析构函数主要是用来做清理工作的. 补充:函数名或变量名前面有"::"但是没有类名,说明这是 ...
- .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]
构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...
- c++基础语法 构造函数 析构函数 类的组合
1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...
- C++基础-4-封装(构造函数与析构函数,深拷贝与浅拷贝,静态成员,this,友元,const修饰成员函数)
4. 封装 4.1.1 封装的意义 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 con ...
- 你好,C++(33)对象生死两茫茫 6.2.3 一个对象的生与死:构造函数和析构函数
6.2.2 使用类创建对象 完成某个类的声明并且定义其成员函数之后,这个类就可以使用了.一个定义完成的类就相当于一种新的数据类型,我们可以用它来定义变量,也就是创建这个类所描述的对象,表示现实世界中 ...
- D06——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D06 20180821内容纲要: 面向对象初级学习 1 面向对象 2 类 (1)封装 (2)继承 (3)多态 3 小结 4 练习:选课系统 5 课外拓展:答题系 ...
- ndk学习之c++语言基础复习----面向对象编程
关于面向对象编程对于一个java程序员那是再熟悉不过了,不过对于C++而言相对java还是有很多不同点的,所以全面复习一下. 类 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程 ...
- php构造函数和析构函数
构造函数 void __construct ([ mixed $args [, $... ]] ) PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用 ...
随机推荐
- [NOI2018]屠龙勇士(exCRT)
首先很明显剑的选择是唯一的,直接用multiset即可. 接下来可以发现每条龙都是一个模线性方程.设攻击第i条龙的剑的攻击力为$s_i$,则$s_ix\equiv a_i\ (mod\ p_i)$. ...
- Codechef REBXOR
Read problems statements in Mandarin and Russian. Translations in Vietnamese to be uploaded soon. Ni ...
- 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截
最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒 ...
- [USACO2015DEC]Max Flow
题目大意: 给你一棵n个点的树,有m次操作,每次将给定的路径上所有点的点权+1. 问最后最大的点权是多少. 思路: #include<cstdio> #include<cctype& ...
- 10.4(java学习笔记)CLOB,BLOB基本操作
一.CLOB 1.1CLOB简介 CLOB全称是(Character Large Object)字符大对象,用于存储大量的文本数据. 字符大对象的操作不同于一般数据,是通过流来完成的. 1.2MySQ ...
- 使用Maven下载jar包
有些开源项目不直接提供jar包的下载,而是建议使用Maven下载,以开源库hipster(https://github.com/citiususc/hipster,http://www.hipster ...
- html5:localStorage储存
实例:刷新值会增长,关掉浏览器,再打开,值会在原基础上增长 if(localStorage.pagecount){ localStorage.pagecount=Number(localStorage ...
- 可用性的维度(5E)
可用性的维度 当我检查可用性文献时,我发现可用软件包含如用户友好.易学.可发现性.质量.有用的和阻止错误.在可用性工程中, Jakob Nielsen给出一个产品的五个属性:易学性.效率.可记忆性.容 ...
- ODATA4 及实现
ODATA4 的JAVASCRIPT 实现: http://jaydata.org/ ODATA4 的JAVA 项目 Apache Olingo:http://olingo.incubato ...
- Flexbox兼容性语法汇总
Flexbox版本 flexbox从第一次出现至今总共有三个语法版本,他们分别是: "display:box;" — 2009年的老版本 "display:flexb ...