析构函数

构造函数和析构函数

拟墨画扇 提交于 2019-12-05 03:16:38
参考php Manuel https://www.php.net/manual/zh/language.oop5.decon.php,构造函数__construct()和析构函数__destruct()都是php类中的函数。定义了构造函数的类在实例化时将会先执行一遍构造函数,而定义了析构函数的类则会在其实例对象的所有引用都被删除或该对象被显式销毁时执行。 注意:如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话),析构函数也一样。析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。析构函数在脚本关闭时调用,此时所有的头信息已经发出。以下是几个测试例子 对了,我的在线php编辑地址为http://c.runoob.com/compile/1,主要是因为它方便。希望能给大家带来帮助    来源: https://www.cnblogs.com/smallzhen/p/11902051.html

C++类的定义和对象

时光总嘲笑我的痴心妄想 提交于 2019-12-05 01:51:46
C++类的定义和对象 类的成员变量称为类的属性(Property),将类的成员函数称为类的方法(Method)。在面向对象的编程语言中,经常把函数(Function)称为方法(Method)。 类的定义 class Student{ public: //成员变量 char *name; int age; float score; void say(){ cout<<name<<age<<score<<endl; } }; 类只是一个模板(Template),编译后不占用内存空间. class C++ 中新增的关键字,用来定义类。 成员变量和成员函数,它们统称为类的成员(Member) 创建对象: Student Lilei; //创建对象 Student 是类名, liLei 是对象名。和使用基本类型定义变量的形式类似, 从这个角度考虑,我们可以把 Student 看做一种新的数据类型,把 liLei 看做一个变量。 在创建对象时,class 关键字可要可不要 class Student LiLei; //正确 Student LiLei; //同样正确 还可以创建对象数组: Student allStu[100]; 使用对象指针: Student stu; //pStu 是一个指针,它指向 Student 类型的数据,通过 Student 创建出来的对象 Student

类和对象(中)C++

本小妞迷上赌 提交于 2019-12-05 01:14:02
类中哪些默认的事儿…… 1. 类的6个默认成员函数: 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6个默认成员函数。 class Date{}; 2. 构造函数: 构造函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员 都有 一个合适的初始值,并且在对象的生命周期内只调用一次。 构造函数的给出方式如下,参数可以给出缺省值,也可以重载构造函数。 class Date { public: Date(int year = 2000,int month=1,int day=1) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1; return 0; } 构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主 要任务并不是开空间创建对象,而是初始化对象。 其特征如下: 1、 函数名与类名相同。 2、无返回值。 3、对象实例化时编译器自动调用对应的构造函数。 4、构造函数可以重载。 5、如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定

c++.net学习笔记

断了今生、忘了曾经 提交于 2019-12-04 23:17:18
Notes for c++ learning 程序根据什么特征来区分调用哪个重载函数? 只能靠参数而不能靠返回值类型的不同来区分重载函数。 编译器根据参数为每个重载函数产生不同的内部标识符 在Visual Studio .Net开发环境中,在代码编辑器内输人对象的名称后将自动显示出对应的属性、方法、事件列表,以方便选择和避免书写错误,这种技术被称为_智能感知_ 一个解决方案可以有多个项目 CLR是公共语言运行库 跟踪句柄——(gcnew)相当于c语言的指针 引用不分配内存——不能为空,因为不是定义一个变量,只表示是该用户名是目标变量名的一个别名。 引用前面用&符号,引用使用很简单比较指针(某一变量的位置)。 引用是给某一变量多取一个别名,当建立引用时,程序用另一个变量或对象目标的名字初始化它。缺点是定义之后不能改变8 托管代码和非托管代码:为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码(也就是你多年以来一直编写的代码),依赖于平台和语言叫"非托管代码"。 rand()_生成伪随机数;rand()%max表示产生0-max的随机数;a+rand()%(b-a+1)表示产生【a,b】之间的整数。产生不重复的随机数 array与arraylist:array是本地的程序组件或者数据结构,但是arraylist是一个来自Java集合类的类,一个接口

C++ 虚析构函数

天涯浪子 提交于 2019-12-04 16:27:13
防止内存泄露 子类继承父类后,在子类构造函数里,通过new 来生成一个对象实例 在析构函数里执行释放内存操作,如果父类不加上virtual 关键词 则子类执行的是父类的析构函数,不执行自己的析构函数。 父类不加virtual 子类继承后,并执行析构函数: #include <iostream> /** * C++多态 虚析构函数 (防止内存泄露) */ using namespace std; //形状 class Shape { public: Shape(); ~Shape(); virtual double calcArea(); }; class Coordinate { public: Coordinate(int x, int y); ~Coordinate(); protected: int m_iX; int m_iY; }; //Circle继承Shape class Circle : public Shape { public: Circle(double r); ~Circle(); double calcArea(); protected: double m_dR; Coordinate *coordinate; protected: string m_strName; }; //Rect继承Shape class Rect : public Shape {

第22课.对象的销毁

倾然丶 夕夏残阳落幕 提交于 2019-12-04 01:20:02
1.析构函数 a.c++的类中可以定义一个特殊的清理函数:析构函数。析构函数的功能与构造函数相反。 b.定义: ~ClassName() 1).析构函数 没有参数 也 没有返回值类型声明 ; 2).析构函数在对象销毁时自动被调用 (因为没有参数,所以析构函数不存在函数重载的问题) #include <stdio.h> class Test { int mi; public: Test(int i) { mi = i; printf("Test(): %d\n", mi); } ~Test() { printf("~Test(): %d\n", mi); } }; int main() { Test t(1); Test *pt = new Test(2); delete pt; //这里new分配的空间需要delete来释放时才会使对象调用它的析构函数,要是使用delete来释放结果如下第二张 return 0; } 来源: https://www.cnblogs.com/huangdengtao/p/11826662.html

C++多态

南笙酒味 提交于 2019-12-03 21:59:29
C++多态 概念 C++中实现多态的条件 重写、同名隐藏与重载 多态实现原理 多态实现过程: 扩展 概念 多种形态,在完成某个行为时,当不同的对象去完成时会产生不同的形态。多态又分为动态多态和静态多态。 静态多态 (静态绑定,早绑定):编译器在编译时确定调用哪个函数(体现:函数重载、模板)。 动态多态 (动态绑定,晚绑定):编译时无法确定具体调用哪个函数,只有在代码运行时才知道具体应该调用哪个函数(体现:虚函数+重写)。 C++中实现多态的条件 1.在继承体系中,基类中必须要有 虚函数 ,派生类必须对基类进行 重写 。 2.必须 通过基类的指针或引用 去调用虚函数。 上面两个条件缺一不可。 但是也有两个例外: 协变 和 析构函数 。 协变 :返回值类型不同。基类虚函数返回基类的指针或引用,派生类虚函数返回派生类的指针或引用。基类虚函数也可以返回另一个继承体系基类的指针或引用,其派生类虚函数返回与基类返回的指针或引用相同继承体系的派生类指针或引用。 析构函数 :只要基类中的析构函数被virtual关键字修饰,如果其派生类的显式提供了自己的析构函数,则形成重写。 重写、同名隐藏与重载 重写 :派生类重写基类的虚函数,必须保证派生类虚函数与基类函数的原型(返回值类型、函数名字、参数列表)完全相同。 重载 :只要参数列表(参数个数,参数顺序,参数类型)不同,就构成重载,与返回值无关。

C++ 多态详解及常见面试题

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-03 13:34:23
       今天,讲一讲多态:         多态就是 不同对象对同一行为会有不同的状态 。 (举例 : 学生和成人都去买票时,学生会打折,成人不会)        实现多态有两个条件: 一是 虚函数 重写 , 重写就是用来设置不同状态的                  二是对象调用虚函数时必须是 指针或者引用                       什么是虚函数?什么是重写?         虚函数是带有 virtual 关键字的 成员函数          子类有个和父类 完全相同 (函数名,形参,返回值都相同,协变和析构函数除外) 的 虚函数 ,就称子类虚函数重写父类虚函数                  多态的原理?         多态是用 虚函数表 实现的。        有虚函数的类都会生成一个虚函数表, 这个表在 编译时 生成。        虚函数表是一个 存储虚函数地址的 数组 ,以NULL结尾。        如果要生成子类虚表,就要经过三个步骤:第一步,将父类虚表内容 拷贝 到子类虚表上;                          第二步,将子类 重写的虚函数覆盖掉 表中父类的虚函数;                          第三步,如果子类有 新增加 的虚函数,按 声明次序加到最后        多态如何调用?        

[转载]深入理解Java垃圾回收机制

ぃ、小莉子 提交于 2019-12-03 10:56:56
深入理解Java垃圾回收机制 2016-07-28 20:07:49 湖冰2019 阅读数 14607 更多 分类专栏: JAVA基础 原文: http://www.linuxidc.com/Linux/2015-06/118829.htm 一、垃圾回收机制的意义   Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。   ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。 二、垃圾回收机制中的算法   Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。   1.引用计数法(Reference Counting Collector) 1.1算法分析    引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象实例都有一个引用计数。当一个对象被创建时

C++虚析构函数

匿名 (未验证) 提交于 2019-12-03 00:40:02
使用虚析构函数举例: //本例演示析构函数需要被定义成虚函数的情况,注意构造函数是不可以被定义成虚函数的 #include <iostream> using namespace std ; class Base { public : ~ Base (); //virtual ~Base(); }; Base ::~ Base (){ cout << "Base destructor" << endl ; } class Derived : public Base { private : int * p ; public : Derived (); ~ Derived (); //virtual ~Derived(); }; Derived :: Derived (){ p = new int ( 0 ); } Derived ::~ Derived (){ cout << "Derived destructor" << endl ; } void fun ( Base * b ){ delete b ; } int main (){ Base * b = new Derived (); fun ( b ); //由于会直接调用基类,所以在派生类中分配的空间不会被释放掉,造成内存泄露 //解决方法是:将基类和派生类的析构函数声明为虚函数(即每行注释的代码) system (