习题课1 new delete
- 格式:pptx
- 大小:73.97 KB
- 文档页数:9


每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap)。
C语言用一堆标准库函数malloc和free在自由存储区中分配存储空间,而C++则用new和delete表达式实现相同的功能。
一、new和delete创建和释放动态数组:数组类型的变量有三个重要的限制:数组长度固定,在编译时必须知道其长度,数组只在定义它的语句内存在。
动态数组:长度固定,编译时不必知道其长度,通常是运行时确定;一直存在,直到程序显示释放它。
1、动态数组的定义:数组变量通过指定类型、数据名和维数来定义。
而动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针:int *pia=new int[10];在自由存储区中创建的数组对象没有名字,只能通过其地址间接访问堆中的对象。
2、初始化动态分配的数组:若数组元素具有类类型,将使用该类的默认构造函数初始化;若数组元素是内置类型,则无初始化。
也可跟在数组长度后面的一堆空圆括号,对数组元素做值初始化。
string *psa=new string[10]; //array of 10 empty stringsint *pia=new int[10]; //array of 10 uninitialized intsint *pia2=new int[10](); //array of 10 zero对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。
3、const对象的动态数组:若在堆中创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化:因数组元素都是const对象,无法复制。
const int *pci_ok=new const int[100]();C++允许定义类类型的const数组,但该类型必须提供默认构造函数。
课后习题第一章认识C++的对象一、单项选择题1.下列选项中不是C++语言关键字的是(B)A、typedef B、mycase C、typeid D、typename2.下列选项中不是C++语言合法标识符的是(C)A、area B、_age C、-xy D、w1233.下列选项中正确的标识符是(C)A、case B、de。
fault C、c_ase D、a. b二、填空题1.来处理标准输入的是cin,用来处理屏幕输出的是cout。
2.动态分配内存使用关键字new,释放内存使用关键字delete。
3.为整数55分配一块内存的语句为int a = 55;。
三、改错题1.分析如下主程序中的错误。
void main( ){int& ref=num;ref=ref+100;num=num+50;}2.分析如下主程序中的错误。
void main( ){int x=58,y=98;int* const p=&x;*p=65;p=&y;}3.分析如下主程序中的错误。
void main( ){int x=58,y=98,z=55;int* const p=&x;*p=65;p=&y;z=*p;}四、编程题1.分别用字符和ACSII码形式输出整数值65和66。
2.编写一个为int型变量分配100个整形量空间的程序。
3.编写完整的程序,它读入15个float值,用指针把它们存在一个存储块里,然后输出这些值的和以及最小值。
4.声明如下数组:int a[ ]={1,2,3,4,5,6,7,8};先查找4的位置,将数组a复制给数组b,然后将数组a的内容反转,再查找4的位置,最后分别输出数组a和b的内容。
答案:#include <iostream>#include <iomanip>#include <algorithm>#include <ctype.h>typedef int array[100];float max(float,float);void main(){//改错一int num=0;int& ref=num;ref=ref+100;num=num+50;//改错二int abc=58,abd=98;int* const p3=&abc;*p3=65;//p3=&abd;//编程一char x = 65;char y = 66;cout << "character 65=" << x << " " << " character 66=" << y <<endl ; cout << "Ascii 65=" << '\65' << " " << " Ascii 66=" << '\66' <<endl ;//编程二int *p1 = new int[100];//编程三//float three[15]={0};float *p ;p = new float[15];float sum_value = 0.0f;float max_value = 0.02f;for (int i=0;i<15;i++){cout << "please type the " << i+1 << "st Number: " ;cin >> *(p+i);sum_value = sum_value + *(p+i);max_value = max(max_value,*(p+i));}cout << "The Sum value = " << sum_value <<endl;cout << "The Max value = " << max_value << endl;//编程四int a[]={1,2,3,4,5,6,7,8},b[8];int *z = find(a,a+8,4);cout << "the 4 memory address of array a is : " << z << " , it's position is :" << a[*z] << endl;copy(a,a+8,b);reverse(a,a+8);z = find(a,a+8,4);cout << "the 4 memory address of reverse array a is :" << z << " , it's positionis : " << a[*z] << endl;cout << "the array a is :";copy(a,a+8,ostream_iterator<int>(cout," "));cout << endl;cout << "the array b is :";copy(b,b+8,ostream_iterator<int>(cout," "));cout << endl;}float max(float m1,float m2){return (m1>m2)?m1:m2;}第二章从结构到类的演变一、单项选择题1.使用string类建立对象的不正确方式是(D)A、string str(“OK”) B、string str=”OK”C、string str D、string str=’OK’;2.下面所列各项中,不是面向对象程序设计所具特点的选项是(D)A、封装B、继承C、抽象D、函数。
《数据库系统概论》课程习题及参考答案一、选择题1. 以下哪项不是数据库系统的组成部分?A. 数据库B. 数据库管理系统C. 数据字典D. 应用程序答案:C2. 数据库管理系统的核心是?A. 数据定义B. 数据操纵C. 数据控制D. 数据库语言答案:D3. 在数据库系统中,下列哪个不是数据模型的三要素?A. 数据结构B. 数据操作C. 数据约束D. 数据存储答案:D4. 以下哪个不是SQL语言的数据定义功能?A. CREATEB. DROPC. ALTERD. SELECT答案:D5. 在关系数据库中,下列哪个不是关系的基本操作?A. 插入B. 删除C. 更新D. 排序答案:D二、填空题1. 数据库系统由____、____、____和____组成。
答案:数据库、数据库管理系统、数据库管理员、应用程序2. 数据库管理系统的主要功能包括____、____、____和____。
答案:数据定义、数据操纵、数据控制、数据维护3. 数据模型分为____、____、____和____。
答案:层次模型、网状模型、关系模型、面向对象模型4. SQL语言的数据定义功能包括____、____和____。
答案:CREATE、DROP、ALTER5. 关系数据库的完整性约束包括____、____和____。
答案:实体完整性、参照完整性、用户定义的完整性三、简答题1. 简述数据库系统的特点。
答案:数据库系统的特点如下:(1)数据共享性高,冗余度低;(2)数据独立性高;(3)数据安全性好;(4)数据一致性;(5)支持事务处理。
2. 简述关系数据库的三大范式。
答案:关系数据库的三大范式如下:(1)第一范式(1NF):每个字段都是不可分割的最小数据单位,不存在重复的组;(2)第二范式(2NF):在1NF的基础上,表中的所有非主属性完全依赖于主键;(3)第三范式(3NF):在2NF的基础上,表中的所有字段之间不存在传递依赖。
3. 简述SQL语言的数据操纵功能。
ThinkinginC++----第13,14,15章(new和delete操作符的⾏为、。
⼀、动态对象创建在C++中,创建⼀个对象会发⽣两件事:1. 为对象分配内存;2. 调⽤构造函数来初始化那个内存。
new和malloc的区别这也是⼀个较常见的⾯试题,malloc只是为对象申请了⼀定⼤⼩的内存;⽽new做了两件事,⼀是为对象分配内存,⼆是调⽤对象的构造函数。
delete和free的区别free只是释放了对象所占⽤的内存;⽽delete做了两件事,⼀是调⽤对象的析构函数,⼆是释放对象的内存。
delete只⽤于删除由new创建的对象。
如果⽤malloc创建⼀个对象,然后⽤delete删除它,这种⾏为是未定义的。
注:⼤多数默认的new和delete实现机制都使⽤了malloc和free。
⼩⼼delete void*如果你使⽤delete操作符删除⼀个void *类型的对象,那么这个对象的内存能够被正常释放,但是这个对象的析构函数却不会被调⽤,因为delete⽆法找到适当的类型信息。
这有可能会造成资源泄露。
new-handler当内存不够⽤时,std::set_new_handler函数允许我们指定⼀个函数,以处理这种情况。
详细的介绍,参考《Effective C++》Item 49⼆、将基类的析构函数设计为virtual看如下情况:假设有⼀个基类Base, ⼀个派⽣类DeriveBase *b = new Derive;delete b; // 调⽤谁的析构函数?如果Base的析构函数是virtual的,那么delete将调⽤Derive的析构函数,这是正确的调⽤,b将会被正确的删除。
但是如果Base的析构函数不是virtual的,那么delete将调⽤Base的析构函数,⽽将这意味着,Derive类中的某些资源没有被释放,这就造成了资源泄露。
更加详细的描述见《Effective C++》Item7三、构造函数中的虚机制被忽略在普通的函数中调⽤⼀个虚函数,那么这个虚函数的⾏为是在运⾏时决定的;但是在构造函数中调⽤⼀个虚函数,被调⽤的只是这个函数的本地版本,也就是说虚机制在构造函数中不⼯作。