当派生类中含有对象成员时,构造函数调用顺序:基类构造函数→对象成员的构造函数→子类构造函数,析构函数则相反

1.类的构造函数(初始化函数)

所谓初始化,就是把一个刚创建的数据设置成我想要的值,而不是一个不能掌控的随机数。
如果初始化用的是一般的赋值,当属性很多且而大部分属性都是默认的情况下,这种方法会麻烦。

c++为类提供了初始化函数,这个函数在对象被创建时有系统自动调用,是创建对象的最后一步。也就是说,初始化函数是创建对象的一部分,初始化函数退出之后,该对象才完成了创建。初始化函数和类名要保持一致,且没有返回值,也没有void

class Cat
{
public:     //类的权限系统,后面再说,现在暂时都用publicchar name[100];int age;char sex;
public:Cat(char* name,int age,char sex)   //初始化函数{strcpy(this->name,name);this->age=age;this->sex=sex;}void printInfo(){cout<<"This cat's name is "<<name<<endl;cout<<"This cat's age is "<<age<<endl;}
};
//而创建对象Cat myCat;是错误的!!
scanf("%s %d %c",name,age,sex);
Cat myCat(name,age,sex);

构造函数后面加上冒号: 作用是冒号后面跟着的是初始化列表。

构造函数列表初始化执行顺序与成员变量在类中声明顺序相同,与初始化列表中语句书写先后无关。
相对于在构造函数中赋值,初始化列表执行效率更高。

A( int aa, int bb ):a(aa),b(bb)
{
}
相当于
A( int aa, int bb )
{a=aa;b=bb;
}private:int a,b;

(1)对含有对象成员的对象进行初始化

调用格式为“构造函数 : A(初始值),B(初始值),C(初始值)……”
    类line有两个私有对象成员startpoint、endpoint,line的构造函数写成:
    line(int sx,int sy,int ex,int ey):startpoint(sx,sy),endpoint(ex,ey){……}
    初始化时按照类定义中对象成员的顺序分别调用各自对象的构造函数,再执行自己的构造函数

class rectangle //头文件中类定义
{
public:rectangle( int pointX, int pointY, int Width, int Length );
private:CPoint m_point;int m_Width;int m_Length;
};rectangle::rectangle(int pointX, int pointY, int Width, int Length) : m_point(pointX,pointY),m_Width(Width),m_Length(Length)//源文件中构造函数实现
{...
}
等价于
rectangle::rectangle(int pointX, int pointY, int Width, int Length)//源文件中构造函数实现
{m_point.X = pointX;m_point.Y = pointY;m_Width   = Width;m_Length  = Length;...
}

 (2)对于不含对象成员的对象
    类rectangle有两个数据成员length、width,其构造函数写成:
    rectangle():length(1),width(2){}
    rectangle(int x,int y):length(x),width(y){}
   (3)对父类进行初始化
调用格式为“子类构造函数 : 父类构造函数”,如下,其中QMainWindow是MyWindow的父类:

MyWindow::MyWindow(QWidget* parent , Qt::WindowFlags flag) : QMainWindow(parent,flag)

(4)对类的const成员变量进行初始化
由于const成员变量的值无法在构造函数内部初始化,因此只能在变量定义时赋值或使用初始化列表赋值。

2.析构函数

析构函数是对象被销毁时,系统最后调用的一个函数,一般用于扫尾工作。析构函数和构造函数一样,没有的话,系统有默认的,也可以自己定义。析构函数没有返回值,且不带参数。

class Node
{
public:int index;Node* left;Node* right;
public:Node(int i)   //构造函数,带一个参数{index=i;left=0;right=0;}~Node()  //析构函数{if (left)delete left;if (right)delete right;}

一般成员变量里有指针时要写,因为这些指针指的空间一般是用new运算符分配的,不会随着对象的销毁而释放,因为系统只会自己释放那个指针用来存地址的空间,它指的那个空间很可能就孤立了,别人也再也指不过去了,所以要手动释放。

#include<iostream>
using namespace std;
class B
{int x,y;
public:B() {x=y=0;cout<<"Constructor1"<<endl;}B(int i) {x=i;y=0;cout<<"Constructor2"<<endl;}B(int i,int j) {x=i;y=j;cout<<"Constructor3"<<endl;}~B() {cout<<"Destructor"<<endl;}void printf(){cout<<"x="<<x<<",y="<<y<<endl;}
};
int main()
{B *ptr;ptr=new B[3];  //调用第一个构造函数3次ptr[0]=B(); //创建一个无名对象,等价于{B temp; ptr[0]=temp; 释放temp},因此调用第一个构造函数1次,调用析构函数1次;ptr[1]=B(5);ptr[2]=B(2,3);for(int i=0;i<3;i++)ptr[i].printf();delete[] ptr; //删除对象数组ptr,调用析构函数3次
}
/*
Constructor1
Constructor1
Constructor1
Constructor1
Destructor
Constructor2
Destructor
Constructor3
Destructor
x=0,y=0
x=5,y=0
x=2,y=3
Destructor
Destructor
Destructor
*/

类的构造函数与析构函数相关推荐

  1. c++派生类和基类的构造函数和析构函数

    基类和派生类的构造函数顺序,先调用基类的构造函数,在调用派生类的构造函数, 析构函数而言,先调用派生类的析构函数,再调用基类的析构函数 #include<iostream> using n ...

  2. php 派生类 构造,C++派生类的构造函数和析构函数

    派生类对象中包含基类对象,因此派生类对象在创建时,除了要调用自身的构造函数进行初始化外,还要调用基类的构造函数初始化其包含的基类对象.因此,程序中任何能够生成派生类对象的语句,都要说明其包含的基类对象 ...

  3. 类中构造函数、析构函数与赋值函数的重写

    类中构造函数.析构函数与赋值函数的重写 class String { public: String(const char *str = NULL); // 普通构造函数 String(const St ...

  4. C++派生类的构造函数和析构函数

    C++派生类的构造函数和析构函数 派生类的构造函数和析构函数 #include <iostream> using namespace std; class student { public ...

  5. C++类的构造函数、析构函数与赋值函数

    C++类的构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和 ...

  6. 实验名称: 类的构造函数、析构函数和友员成员应用

    实验四 (实验课时:2  实验性质:设计) 实验名称:  类的构造函数.析构函数和友员成员应用 实验目的: (1)练习类的构造函数.析构函数的定义和使用方法: (2)练习对象数组.对象指针的使用: ( ...

  7. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  8. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  9. php中类的构造函数是,PHP 类的构造函数和析构函数

    通常一提到 PHP 的构造函数和析构函数,就会想到两个单词 construct 和 destruct,构造和解构. 在学习 PHP 的时候,了解到的构造函数和析构函数就是 __construct() ...

  10. 类的构造函数和析构函数详解

    一:类的构造函数 1.构造函数定义 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可 ...

最新文章

  1. linux php 编译 pdo,Linux 下 PHP 扩展 PDO 编译安装
  2. c++强大还是python强大-Python 到底是强类型语言,还是弱类型语言?
  3. java虚拟机启动参数分类详解
  4. DL之SegNet:SegNet图像分割/语义分割算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  5. VTK修炼之道26:图像基本操作_三维图像切片提取
  6. create报错不是函数_创建空文档失败,OnCreate函数报错了吗
  7. PHP调用新浪API 生成短链接
  8. 【深圳(活动)】70多场干货分享!价值899元的2018中国开源年会门票等你认领
  9. 会计电算化算不算计算机专业,成都会计学校会计电算化专业介绍
  10. 从数据传输的角度辨析表单设计时的 get 和 post 提交方法
  11. 你真正了解public、internal、protected、private吗?不妨幽默一些
  12. .net 序列化与反序列化
  13. Intel® Nehalem/Westmere架构/微架构/流水线 (9) - 系统软件增强/能耗增强
  14. visa虚拟卡生成器_虚拟信用卡。亲,你懂了吗?
  15. echars中国地图,省份名字居中
  16. Kotlin学习笔记 —— 函数,字符串,可空性以及标准库函数(2)
  17. 实验二 语法分析1——递归子程序法
  18. UE 4.13 3D Widget使用
  19. 中国科学院大学计算机考研信息汇总
  20. Delphi 2010安装及使用UniDAC安装和使用笔记

热门文章

  1. 嵌入式软件调试:任务执行时间与负载率
  2. linux制作windows光盘,在Windows上制作CentOS自动安装的光盘的教程分享
  3. 攻防世界web新手- fileinclude宜州网信办
  4. 希捷和西数移动硬盘哪个好_希捷和西数硬盘哪个好?
  5. 数学知识——素数回文
  6. 微处理器, 中央处理器的概念
  7. 面试官:MySQL中的7种日志你都知道是干啥的吗?
  8. [实体关系抽取|顶刊论文]UniRel:Unified Representation and Interaction for Joint Relational Triple Extraction
  9. 常见显示技术的区别(LCD OLED等,详细版)
  10. 华为应急通讯 迅驰C2 新版双网 原版GSMS软件六合一套装U盘版 ISO文件 百度网盘下载