析构函数

继承知识点心得

匿名 (未验证) 提交于 2019-12-03 00:39:02
知识点 继承:在已有类的基础上创建新类的过程 一个 B 类继承A类,或称从类 A 派生类 B 类 A 称为基类(父类),类 B 称为派生类(子类) 类继承关系的语法形式 访问控制表示派生类对基类的继承方式,使用关键字: 不论种方式继承基类,派生类都不能直接使用基类的私有成员 派生类的生成过程经历了三个步骤: 在C++的继承机制中,派生类吸收基类中除构造函数和析构函数之外的全部成员。 通过在派生类中定义同名成员(包括成员函数和数据成员)来屏蔽(隐藏)在派生类中不起作用的部分基类成员。 仅仅继承基类的成员是不够的,需要在派生类中添加新成员,以保证派生类自身特殊属性和行为的实现。 #include<iostream> using namespace std ; class A { public : }; class B : public A { public : }; class C : public B { public : }; 定义一个基类person(不定义构造函数) 姓名、性别、年龄(访问权限设置为私有) 定义公有的成员函数set_p() 定义公有的成员函数display_p(),显示person的信息 再由基类派生出学生类(不定义构造函数,采用公有继承的方式) 增加学号、班级、专业和入学成绩 定义公有成员函数set_t() 定义成员函定义公有的成员函数display_s()

内联函数(inline) ,提高效率?

匿名 (未验证) 提交于 2019-12-03 00:37:01
①当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它 函数体比较短 , 性能关键的函数, 鼓励使用内联. ②一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用! 不一定! 因为函数调用是需要开销的(函数调用时的参数压栈、栈帧开辟与销毁、以及寄存器保存与恢复等等操作),如果说函数本身的代码量比较小,比函数调用时做的准备工作的代码还要小,那此时如果使用内联的话,肯定比不使用内联的代码量还要小[2]。 不过如果函数的代码量稍大,通常还是会增加代码量的,因为内联函数是在编译阶段被编译器展开在调用处的,多次调用就需要多段重复的代码放在各个调用处。对于非内联函数,只需要保存一份函数体的代码,然后进行调用就好了。所以,在空间上,一般来说使用内联函数会导致生成的可执行文件变大。 首先,大家都知道现在计算机的存储结构,这里只考虑高速缓存到内存这一部分,从高到低,每一级的访问时间近似以成千倍甚至更高的增加。 其次,高速缓存的大小是很小的(对于我们运行的程序来说),所以我们的数据不可能都被装载到高速缓存中,这就引出了一个命中率的问题。在不命中的时候,就需要向更为下层的存储结构寻找索取目标数据,宝贵的时间也因此不断大幅增加。正如我们前面所说

从程序员角度来看ELF文件

匿名 (未验证) 提交于 2019-12-03 00:37:01
1 介绍 ELF文件是一种linux/unix上通用的可执行文件格式,其比a.out和COFF二进制格式有更多的灵活性和功能。 2 类型 三种类型: (1)可执行文件,包含代码和数据,指定了进程的地址空间分布; (2)可重定位文件,包含代码和数据,用于被其他的可重定位文件或者共享库文件链接使用; (3)共享库文件,包含代码和数据,在静态链接和动态链接时,被链接工具ld使用,动态链接库一般以.so结尾。 ELF文件最有用的地方在于其内部的section结构。 3 .init 和 .fini section介绍 3.1 概述 (1)ELF系统加载一个ELF文件到内存中,需要一些段的信息来构建该进程的虚拟地址空检结构的分布,一个段包括很多的section。 (2)一个ELF文件包括由section组成的数组,数组中有一些很重要的section需要被程序员理解:.fini section,该节中包括一个进程正常退出需要执行的代码;.init section,该节包括进程开始真正执行前需要执行的代码,即main函数之前。 当一个函数被放到.init section中的时候,那么该函数将会在main函数执行前被执行;当一个函数被放置到.fini sction中的时候,那么该函数将会在main函数返回后执行。 因此,构造函数和析构函数可以在这两个节中执行。 3.2 C+

从程序员角度来看ELF文件

匿名 (未验证) 提交于 2019-12-03 00:37:01
1 介绍 ELF文件是一种linux/unix上通用的可执行文件格式,其比a.out和COFF二进制格式有更多的灵活性和功能。 2 类型 三种类型: (1)可执行文件,包含代码和数据,指定了进程的地址空间分布; (2)可重定位文件,包含代码和数据,用于被其他的可重定位文件或者共享库文件链接使用; (3)共享库文件,包含代码和数据,在静态链接和动态链接时,被链接工具ld使用,动态链接库一般以.so结尾。 ELF文件最有用的地方在于其内部的section结构。 3 .init 和 .fini section介绍 3.1 概述 (1)ELF系统加载一个ELF文件到内存中,需要一些段的信息来构建该进程的虚拟地址空检结构的分布,一个段包括很多的section。 (2)一个ELF文件包括由section组成的数组,数组中有一些很重要的section需要被程序员理解:.fini section,该节中包括一个进程正常退出需要执行的代码;.init section,该节包括进程开始真正执行前需要执行的代码,即main函数之前。 当一个函数被放到.init section中的时候,那么该函数将会在main函数执行前被执行;当一个函数被放置到.fini sction中的时候,那么该函数将会在main函数返回后执行。 因此,构造函数和析构函数可以在这两个节中执行。 3.2 C+

习题5

匿名 (未验证) 提交于 2019-12-03 00:33:02
C++的两种联编方式为: 静态 联编和 动态 联编。 C++支持两种多态性,静态联编所支持的多态性被称为 编译时的多态性 、动态联编所支持的多态性被称为 运行时的多态性 。 重载函数在编译时表现出多态性,就是 静态 联编;而虚函数则在运行时表现出多态性是 动态 联编。 为了区分重载函数,把一个派生类中重定义基类的虚函数称为 覆盖 。 如果派生类与基类的虚函数仅仅返回类型不同,其余相同,则C++认为是 使用不恰当的虚函数 。 在构造函数和析构函数中调用虚函数时,采用 静态 联编。 纯虚函数的定义是在虚函数定义的基础上,再让函数等于 0 。 对于包含有纯虚函数的类被称为 抽象类 。 用关键字( A )标记的函数被称为虚函数。 A. virtual B. private C. public D. protected 在C++中,要实现动态联编,必须使用( D )调用虚函数 A. 类名 B. 派生类指针 C. 对象名 D. 基类指针 下列函数中,可以作为虚函数的是( BD )。 A. 普通函数 B. 非静态成员函数 C. 构造函数 D. 析构函数 在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( B )。 A. 不同 B. 相同 C. 相容 D. 部分相同 使用虚函数保证了在通过一个基类类型的指针(含引用)调用一个虚函数时,C++系统对该调用进行

实验3 构造函数与析构函数

匿名 (未验证) 提交于 2019-12-03 00:32:02
实验目的和要求 1、熟悉类的定义格式和类中成员的访问权限。 实验内容 [cpp] view plain copy "font-size:18px;" > //sy3_1.cpp #include<iostream> using namespace class public int void private int int //ERROR return 运行结果如下: 修改程序如下: [cpp] view plain copy "font-size:18px;" > //sy3_1.cpp using namespace class public int void private int int return 正确程序运行结果如下: 2、调试下列程序。 [cpp] view plain copy "font-size:18px;" > //sy3_2.cpp #include<iostream> using namespace class public int int int return int return private int int "p3=(" <<p3.getx()<< "," <<p3.gety()<< ")\n" return 在该程序中,将TPoint类的带有两个参数的构造函数进行修改,在函数体内增加下述语句: cout<<"Constructor is

C++PTA判断/选择题总结

匿名 (未验证) 提交于 2019-12-03 00:32:02
1-1 使用提取符(<<)可以输出各种基本数据类型的变量的值,也可以输出指针值。 (2分) T 1-2 预定义的插入符从键盘上接收数据是不带缓冲区的。 (2分) F 1-3 The cin stream normally is connected to the display screen. (2分) F 【cout 对象通常连接到标准输出设备,一般是显示屏】 2-1命名空间应用于: (2分) 在类外定义类的成员函数 √避免各个不同函数、变量等的名称冲突 提高代码的执行速度 以上答案都正确 2-2cout 是由I/O 流库预定义的( )。 (2分) 类 √对象 包含文件 常量 2-1 重载函数在 调用 时选择的依据中,错误的是()。 (2分) 函数的参数 参数的类型 函数的名字 √函数的类型 2-2 对定义重载函数的下列要求中,( )是错误的。 (2分) 要求参数的个数不同 要求参数中至少有一个类型不同 √要求函数的返回值不同 要求参数个数相同时,参数类型不同 1-1 函数的参数个数和类型都相同,只是返回值不同,这不是重载函数。 (1分) T 1-3The types of arguments in a function call must match the types of the corresponding parameters in the function

实验三 构造函数与析构函数

匿名 (未验证) 提交于 2019-12-03 00:32:02
实验目的和要求 实验内容 运行程序如下: #include<iostream> using namespace std; class Aa { public: Aa(int i=0){a=i;cout<<"Constructor"<<a<<endl;} ~Aa(){cout<<"Destructor"<<a<<endl;} void print(){cout<<a<<endl;} private: int a; }; int main() { Aa a1(1),a2(2); a1.print(); cout<<a2.a<<endl;//ERROR return 0; } 错误如下: 修改程序如下: #include<iostream> using namespace std; class Aa { public: Aa(int i=0){a=i;cout<<"Constructor"<<a<<endl;} ~Aa(){cout<<"Destructor"<<a<<endl;} void print(){cout<<a<<endl;} private: int a; }; int main() { Aa a1(1),a2(2); a1.print(); a2.print(); return 0; } 运行结果如下: 2、调试下列程序: #include<iostream> using

实验3 构造函数与析构函数

匿名 (未验证) 提交于 2019-12-03 00:27:02
实验目的和要求 1、熟悉类的定义格式和类中成员的访问权限。 2、构造函数与析构函数的调用时机与顺序。 3、掌握对象的定义以及对象的初始化的时机与方法。 实验内容 1、下面程序sy3_1.cpp中用ERROR标明的语句有错吧,在不删除和增加代码行的情况下,改正错误语句,使其正确运行。 运行程序如下: [cpp] view plain copy [cpp] view plain copy #include<iostream> using namespace std; class Aa { public : Aa( int i=0){a=i;cout<< "Constructor" <<a<<endl;} ~Aa(){cout<< "Destructor" <<a<<endl;} void print(){cout<<a<<endl;} private : int a; }; int main() { Aa a1(1),a2(2); a1.print(); cout<<a2.a<<endl; //ERROR return 0; } 错误如下: 修改程序如下: [cpp] view plain copy #include<iostream> using namespace std; class Aa { public : Aa( int i=0){a=i;cout<<

C++ 中的创建和删除数组(new/delete 和 new[]/delete[])

匿名 (未验证) 提交于 2019-12-03 00:26:01
C++ 中的创建和删除数组(new/delete 和 new[]/delete[]) 已有 4122 次阅读 2017-4-17 16:33 | 个人分类: C++ | 系统分类: 科研笔记 | 关键词:C++,数组,动态数组 | 数组 , 动态数组 在 C++ 中,我们也许经常使用需要建立数组和释放内存的问题,在动态分配内存的时候一般有两种方式,一个是malloc和new两种形式。 比如使用malloc的时候,一般形式如下: har *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); if (NULL == Ptr) { exit (1); } gets(Ptr); free(Ptr); 在使用new的时候,一般的形式如下: 1. 删除单变量地址空间 2. 删除数组空间 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? 如果你对这些问题都有疑问的话,不妨看看我这篇文章。 new 和 delete 到底是什么? 如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数。在这里,和 sizeof 类似,new 和 delete 也不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以组成表达式。和 sizeof 不同的是