析构函数

派生类的构造函数与析构函数的调用顺序

你。 提交于 2020-03-07 21:39:59
派生类构造函数各部分的执行次序为 1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用。 2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用 3.派生类的构造函数体中的操作 在派生类构造 函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表 如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。 如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。 //Test1.h #include<iostream> using namespace std; class Base1 { private: int a1; public: Base1()//(int _a):a1(_a) { cout<<"It's base1 built. "<<endl; } ~Base1(){cout<<"Base1 was free. "<<endl;} }; class Base2 { private: int a2; public: Base2()//(int _a):a2(_a) { cout<<"It's base2 built. "<<endl; } ~Base2(){cout<<"Base2 was free. "<<endl;} }; class Base3 { private: int a3; public:

C++中delete和delete[]的区别

两盒软妹~` 提交于 2020-03-07 06:48:21
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 请看下面的程序。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream>; using namespace std; class T { public : T() { cout << "constructor" << endl; } ~T() { cout << "destructor" << endl; } }; int main() { const int NUM = 3; T* p1 = new T[NUM]; cout << hex << p1 << endl; // delete[] p1; delete p1; T* p2 = new T[NUM]; cout << p2 << endl; delete [] p2; } 大家可以自己运行这个程序,看一看 delete

C/C++知识点

戏子无情 提交于 2020-03-04 21:12:03
1 cout<<endl;什么意思?   就是回车的意思~ 相当于C语言里面的printf("\n"); 2 cin>> 键盘输入 例子:double r=1.0; cin>>r; //键盘输入 注意一个约定,引入标准头文件用尖括号,引入自定义头文件用双引号, 例如: 复制纯文本新窗口 #include <stdio.h> #include "myFile.h" 3 字符串结束符是“\n”,文件结束标志是EOF 4 getch()的功能   是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行。 5 C++提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来 。如   3+5, 6+8   称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为:   表达式1, 表达式2   逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。如,逗号表达式   a=3*5, a*4    赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。             整个逗号表达式的值为60。 6 如果使用用户自己定义的函数,而该函数与调用它的函数(即主调函数)在同一个程序单位中

虚函数和纯虚函数

﹥>﹥吖頭↗ 提交于 2020-03-03 11:56:43
class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B:public A { public: void foo() { cout<<"B::foo() is called"<<endl; } }; int main(void) { A *a = new B(); a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0; }   上诉代码是虚函数的一个例子。其中B类继承A类,由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。而虚函数只能借助于指针或者引用来达到多态的效果。 纯虚函数 一、定义: virtual void funtion1()=0   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 二、引入原因: 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。   为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法

C++中delete和delete[]的区别

元气小坏坏 提交于 2020-03-02 01:22:38
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 请看下面的程序。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include ; using namespace std; class T { public : T() { cout << "constructor" << endl; } ~T() { cout << "destructor" << endl; } }; int main() { const int NUM = 3; T* p1 = new T[NUM]; cout << hex << p1 << endl; // delete[] p1; delete p1; T* p2 = new T[NUM]; cout << p2 << endl; delete [] p2; } 大家可以自己运行这个程序,看一看 delete p1 和

C++复习知识点总结(二)

独自空忆成欢 提交于 2020-03-02 01:15:28
一:C++多态与虚函数 1:基类的指针也可以指向派生类对象 People *p = new People(“王志刚”, 23) p = new Teacher(“赵宏佳”, 45, 8200);//指向派生类对象 调用函数时会出错(people的函数中没有第三项,及8200的数据),即当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数 基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。使用虚函数非常简单,只需要在函数声明前面增加 virtual 关键字。即:virtual 类型 函数名 对于派生类比较多,如果不使用多态,那么就需要定义多个指针变量,很容易造成混乱;而有了多态,只需要一个指针变量 p 就可以调用所有派生类的虚函数。 2:虚函数注意事项及条件 虚函数对于多态具有决定性的作用,有虚函数才能构成多态。 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。 基类中的函数声明为虚函数,这样所有派生类中具有遮蔽关系的同名函数都将自动成为虚函数 只有派生类的虚函数覆盖基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。例如基类虚函数的原型为virtual void func();

PHP反序列化漏洞总结

时光怂恿深爱的人放手 提交于 2020-03-01 03:32:30
又到了金三银四跳槽季,很多小伙伴都开始为面试做准备,今天小编就给大家分享一个网安常见的面试问题:PHP反序列化漏洞。 虽然PHP反序列化漏洞利用的条件比较苛刻,但是一旦被利用就会产生很严重的后果,所以很多公司都比较关注这个技能点,小伙伴们一定要掌握哦。 PHP序列化与反序列化介绍 什么是序列化与反序列化 维基百科中这样定义:序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。 概念很容易理解,其实就是将数据转化成一种可逆的数据结构,自然,逆向的过程就叫做反序列化。 那么序列化与反序列化有什么用处呢? 举个例子: 比如:现在我们都会在淘宝上买桌子,桌子这种很不规则的东西,该怎么从一个城市运输到另一个城市,这时候一般都会把它拆掉成板子,再装到箱子里面,就可以快递寄出去了,这个过程就类似我们的序列化的过程(把数据转化为可以存储或者传输的形式)。当买家收到货后,就需要自己把这些板子组装成桌子的样子,这个过程就像反序列的过程(转化成当初的数据对象)。 也就是说,序列化的目的是方便数据的传输和存储。 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。 常见的序列化格式: 二进制格式 字节数组

第二章 类和对象

大憨熊 提交于 2020-03-01 03:17:57
一、类中成员函数和成员变量存储位置 成员变量在堆区或栈区分配内存,成员函数在代码区分配内存。 sizeof(className) == sizeof(成员变量) 二、析构函数的执行时机 在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数。 在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数。 new 创建的对象位于堆区,通过 delete 删除时才会调用析构函数;如果没有 delete,析构函数就不会被执行。 三、本章内容 来源: CSDN 作者: 路哞哞 链接: https://blog.csdn.net/qq_34696503/article/details/104582445

php面向对象基础知识点总结

故事扮演 提交于 2020-02-29 13:17:44
下面是一些PHP面向对象基础知识的摘录,摘录内容来自PHP5.1手册。 1.类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。 2.属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是 在编译阶段之后在运行阶段运算出的常数。 3.在类的成员方法里面,可以通过$this->property(property是属性名字)这种方式来访问类的属性、 方法,但是 要访问类的静态属性或者在静态方法里面却不能使用,而是使用self::$property。 4.在类的非静态方法里面可以使用伪变量$this,这个伪变量是调用该方法的实例化对象引用 5.常量的值必须是一个定值,不允许修改,且不能是变量,类属性或其它操作(如函数调用)的结果。 <?php class MyClass { const constant = 'constant value'; function showConstant() { echo self::constant . "\n"; } } echo MyClass::constant . "\n"; $n=new MyClass(); $n->showConstant(); ?> 6.构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

《Effectirve C++》笔记(条款1~10)

╄→гoц情女王★ 提交于 2020-02-29 03:54:21
条款1:视C++为一个语言联邦 C是多种范式汇集的语言,包括C的过程、C面向对象、Template泛型(STL模板库)、模板元编程、lambda。(后面自己补充可能由曲解原文意思) 条款2:尽量以const、enum、inline替换#define 单纯变量用const或enum替换define,形势函数的宏用inline函数替换。 class ttt{ enum{NumTurns=5}; int scores[NumTurns]; } 用枚举替换更像define,因为枚举和define均不可取地址,而const的变量可以被取地址。 条款3:尽可能使用const const char *p; 指针非常量,数值为常量--我还是喜欢声明时把*和变量放一起,构成一个整体,这样也容易理解,const就是对这个整体修饰的这个整体不可变也就是*p也就是值不可变。char * const p;指针常量,值非常量 对函数指定const:void a() const;此时函数不可调用非const成员(可以读非const数据成员),如某个数据成员需要被const方法操作,可以用mutable修饰:mutable boos bbb; const char& operator[](std::size_t position)const { XXXXX return pText[position]; }