C++ 第3章类和构造函数
- 格式:ppt
- 大小:1.36 MB
- 文档页数:36
面向对象程序设计课后题答案第二章C++概述【2.6】D【2.7】D【2.8】A【2.9】A【2.10】B【2.11】A【2.12】C【2.13】B【2.14】D【2.15】C【2.16】D【2.17】C【2.18】程序的运行结果:101【2.19】程序的运行结果:10 10【2.20】程序的运行结果:1020【2.22】编写一个C++风格的程序,用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中。
#include <iostream.h>int main(){int *p,i;p[0]=1;p[1]=1;for(i=2;i<20;i++){p[i]=p[i-1]+p[i-2];}for(i=0;i<20;i++){cout<<p[i]<<endl;}return 0;}【2.23】编写一个C++风格的程序,建立一个被称为sroot()的函数,返回其参数的二次方根。
重载sroot()3次,让它返回整数、长整数与双精度数的二次方根。
#include <iostream.h>#include<math.h>double sroot(int m){return sqrt(m);}double sroot(long m){return sqrt(m);}double sroot(double m){return sqrt(m);}int main()cout<<"sroot(145)="<<sroot(145)<<endl;cout<<"sroot(123456)="<<sroot(123456)<<endl;cout<<"sroot(1.44)="<<sroot(1.44)<<endl;return 0;}【2.24】编写一个C++风格的程序,解决百钱问题:将一元人民币兑换成1、2、5分的硬币,有多少种换法?#include <iostream.h>int main(){int k=0;for(int i=0;i<=20;i++){for(int j=0;j<=50;j++){if(100-5*i-2*j>=0){k++;}}}cout<<"将一元人民币兑换成1、2、5分的硬币,共有"<<k<<"种换法"<<endl;return 0;}【2.25】编写一个C++风格的程序,输入两个整数,将它们按由小到大的顺序输出。
C语言里面构造函数和析构函数的运用办法C语言里面构造函数和析构函数的运用办法摘要:构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误。
本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项。
关键字:构造函数;析构函数;垃圾回收器;非托管资源;托管资源一.构造函数与析构函数的原理作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性。
C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙。
但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是冰山一角。
级别高的错误通常隐藏得很深,不容易发现。
根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。
微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。
当对象被创建时,构造函数被自动执行。
当对象消亡时,析构函数被自动执行。
这样就不用担心忘记对象的初始化和清除工作。
二.构造函数在C#中的运用构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。
它的命名方法既简单又合理:让构造函数与类同名。
除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。
如果它有返回值类型,那么编译器将不知所措。
在你可以访问一个类的方法、属性或任何其它东西之前,第一条执行的语句是包含有相应类的构造函数。
甚至你自己不写一个构造函数,也会有一个缺省构造函数提供给你。
class TestClass{public TestClass(): base() {} // 由CLR提供}下面列举了几种类型的构造函数1)缺省构造函数class TestClass{public TestClass(): base() {}}上面已介绍,它由系统(CLR)提供。
C语言结构体构造函数简介在C语言中,结构体(struct)是一种自定义的数据类型,用于将不同类型的变量组合在一起形成一个新的复合数据类型。
结构体构造函数是一种用于创建并初始化结构体变量的方法,类似于其他面向对象编程语言中的构造函数,用于为结构体变量分配内存空间并初始化其成员变量。
本文将详细介绍C语言中结构体构造函数的概念、使用方法以及注意事项。
结构体构造函数的定义和作用结构体构造函数是一种特殊的函数,用于创建并初始化结构体变量。
它的作用是方便地为结构体变量分配内存空间并初始化其成员变量,避免手动分配内存和逐个初始化成员变量的繁琐过程。
结构体构造函数的定义与普通函数类似,但其函数名与结构体类型相同,没有返回类型,并在函数体内部完成了分配内存和初始化成员变量的过程。
例如:typedef struct {int age;char name[20];} Person;Person createPerson(int age, const char* name) {Person p;p.age = age;strcpy(, name);return p;}在上述代码中,createPerson函数是一个结构体构造函数,用于创建并初始化Person类型的结构体变量。
它接受两个参数,分别是年龄和姓名,将这些值分别赋给p的成员变量age和name,最后返回创建好的结构体变量p。
使用结构体构造函数创建结构体变量使用结构体构造函数创建结构体变量非常简单,只需要调用结构体构造函数并传入相应参数即可。
以下是使用上述createPerson函数创建Person类型结构体变量的示例:Person person1 = createPerson(25, "Tom");在上述示例中,createPerson函数被调用并传入了25和”Tom”作为参数,返回的结构体变量被赋给了person1。
结构体构造函数的优点结构体构造函数的引入使得创建和初始化结构体变量变得更加便捷和可读,具有以下几个优点:1.简化代码:使用结构体构造函数可以避免手动分配内存和逐个初始化成员变量的繁琐过程,减少了代码的冗余,提高了代码的可读性和可维护性。
《c语言教程(原书第4版)》前言第0章从零开始10.1 为什么要用c 10.2 ansi c标准20.3 从c到c++ 30.4 从c和c++到java 3第1章c语言概述41.1 编程和预备知识41.2 程序输出41.3 变量、表达式和赋值71.4 使用#define和#include 91.5 使用printf()和scanf() 121.6 控制流141.7 函数191.8 数组、字符串和指针241.8.1 数组241.8.2 字符串251.8.3 指针281.9 文件31.1.10 与操作系统有关的内容351.10.1 编写和运行c程序351.10.2 中断程序361.10.3 输入文件尾标志371.10.4 输入和输出的重定向371.11 总结381.12 练习39第2章词法元素、操作符和c系统45 2.1 字符和词法元素462.2 语法规则482.3 注释492.4 关键字502.5 标识符502.6 常量512.7 字符串常量522.8 操作符和标点符号532.9 操作符的优先级和结合性532.10 增值操作符和减值操作符552.11 赋值操作符562.12 例子:计算2的乘方572.13 c系统582.13.1 预处理器592.13.2 标准函数库592.15 练习63第3章基本数据类型693.1 声明、表达式和赋值693.2 基本数据类型713.3 字符和char数据类型723.4 int数据类型753.5 整数类型short、long和unsigned 763.6 浮点类型773.7 typedef的用法793.8 sizeof操作符793.9 使用getchar()和putchar() 803.10 数学函数823.10.1 使用abs()和fabs() 843.10.2 unix和数学函数库843.11 隐式类型转换和强制类型转换843.11.1 整型提升853.11.2 寻常算术转换853.11.3 强制类型转换863.12 十六进制和八进制常量873.13 总结893.14 练习89第4章控制流964.1 关系操作符、相等操作符和逻辑操作符96 4.2 关系操作符和表达式974.3 相等操作符和表达式994.4 逻辑操作符和表达式1004.5 复合语句1034.6 表达式和空语句1034.7 if和if-else语句1044.8 while语句1064.9 for语句1084.10 例子:布尔变量1104.11 逗号操作符1114.12 do语句1124.13 例子:斐波那契数1134.14 goto语句1154.15 break和continue语句1164.16 switch语句1174.17 条件操作符1184.18 总结1194.19 练习120第5章函数1285.1 函数定义1285.2 return语句1305.3 函数原型1315.4 例子:创建乘方表1325.5 从编译器的角度观察函数原型1335.6 函数定义顺序的另一种风格1345.7 函数调用和传值调用1345.8 开发大型程序1365.9 使用断言1385.10 作用域规则1395.10.1 平行和嵌套代码块1405.10.2 以调试为目的使用代码块1405.11 存储类型1415.11.1 auto存储类型1415.11.2 extern存储类型1415.11.3 register存储类型1435.11.4 static存储类型1435.12 静态外部变量1445.13 默认初始化1455.14 递归1455.15 例子:汉诺塔1495.16 总结1525.17 练习153第6章数组、指针和字符串1596.1 一维数组1596.1.1 初始化1606.1.2 下标1606.2 指针1616.3 传引用调用1646.4 数组和指针之间的关系1656.5 指针运算和元素的大小1666.6 数组作为函数的实参1666.7 例子:冒泡排序1676.8 用calloc()和malloc()进行动态内存分配168 6.9 例子:归并和归并排序1716.10 字符串1756.11 标准函数库中的字符串处理函数1776.12 多维数组1806.12.1 二维数组1806.12.2 存储映射函数1806.12.3 形式参数声明1816.12.4 三维数组1826.12.5 初始化1826.12.6 使用typedef 1836.13 指针数组1846.14 main()函数的参数1886.15 不规则数组1896.16 函数作为参数1906.17 例子:使用二分法寻找函数的根192 6.18 函数指针数组1966.19 类型限定符const和volatile 1996.20 总结2006.21 练习202第7章位操作符和枚举类型2147.1 位操作符和表达式2147.1.1 按位求反2157.1.2 补码2157.1.3 位逻辑操作符2167.1.4 左移位和右移位操作符2177.2 掩码2187.3 软件工具:打印int值的二进制形式219 7.4 包装和解包2207.5 枚举类型2237.6 例子:“石头、剪刀、布”游戏2257.7 总结2297.8 练习230第8章预处理器2358.1 #include的使用2358.2 使用#define 2368.3 带参数的宏2378.4 stddef.h中的类型定义和宏2398.5 例子:用qsort()进行排序2398.6 例子:带参数的宏2438.7 stdio.h和ctype.h中的宏2468.8 条件编译2478.9 预定义的宏2498.10 “#”和“##”操作符2498.11 assert()宏2508.12 使用#error和#pragma 2508.13 行号2518.14 对应的函数2518.15 例子:快速排序2518.16 总结2548.17 练习254第9章结构和联合2629.1 结构2629.2 访问结构成员2649.3 操作符的优先级和结合性的总结267 9.4 在函数中使用结构2689.5 结构的初始化2699.6 例子:玩扑克牌2699.7 联合2739.8 位字段2759.9 例子:访问位和字节2769.10 adt堆栈2779.11 总结2809.12 练习281第10章结构和列表处理28810.1 自引用的结构28810.2 线性链表28910.3 链表操作29010.4 一些链表处理函数29310.4.1 插入29410.4.2 删除29510.5 堆栈29610.6 例子:波兰记法和堆栈求值298 10.7 队列30310.8 二叉树30610.8.1 二叉树的遍历30710.8.2 创建树30810.9 普通的树30910.9.1 遍历31110.9.2 calloc()的用法以及树的创建311 10.10 总结31210.11 练习313第11章输入/输出和操作系统318 11.1 输出函数printf() 31811.2 输入函数scanf() 32111.3 fprintf()、fscanf()、sprintf()和sscanf()函数32411.4 fopen()和fclose()函数32511.5 例子:对文件进行空间加倍327 11.6 使用临时文件和优雅函数329 11.7 随机访问文件33111.8 文件描述符输入/输出33211.9 文件访问权限33311.10 在c程序内部执行命令334 11.11 在c程序内部使用管道335 11.12 环境变量33611.13 c编译器33711.14 使用性能评估程序33811.15 函数库33911.16 对c代码进行计时34011.17 使用make 34311.18 使用touch 34711.19 其他有用的工具34811.20 总结34911.21 练习350第12章高级应用35812.1 用fork()创建并发进程35812.2 进程的叠加:exec...()函数族系360 12.3 使用pipe()实现进程间的通信362 12.4 信号36312.5 例子:哲学家用餐问题36512.6 矩阵的动态分配36812.6.1 为什么二维数组无法满足要求368 12.6.2 用指针数组创建矩阵36912.6.3 调整下标范围37112.6.4 一次分配所有内存37312.7 返回状态37412.8 总结37712.9 练习378第13章从c到c++ 38313.1 输出38313.2 输入38413.3 函数38613.4 类和抽象数据类型38713.5 重载38913.6 构造函数和析构函数39013.7 面向对象编程和继承39213.8 多态39313.9 模板39513.10 c++的异常39613.11 面向对象编程的优点39613.12 总结39713.13 练习398第14章从c到java 40214.1 输出40214.2 变量和类型40314.3 类和抽象数据类型40414.4 重载40614.5 类的创建和销毁40614.6 面向对象编程和继承40614.7 多态和重写方法40714.8 applet 40814.9 java的异常40914.10 java和oop的优势41014.11 总结41014.12 练习411附录a 标准函数库413附录b c的语法441附录c ansi c与传统c的比较446附录d ascii字符码452附录e 操作符的优先级和结合性454。
第3章栈和队列习题1.选择题(1)若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在()种情况。
A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1(2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为()。
A.i B.n-i C.n-i+1 D.不确定(3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n (4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。
A.x=top->data;top=top->link; B.top=top->link;x=top->link;C.x=top;top=top->link; D.x=top->link;(5)设有一个递归算法如下int fact(int n) { //n大于等于0if(n<=0) return 1;else return n*fact(n-1); }则计算fact(n)需要调用该函数的次数为()。
A. n+1 B. n-1 C. n D. n+2 (6)栈在()中有所应用。
A.递归调用 B.函数调用 C.表达式求值 D.前三个选项都有(7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。
主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。
该缓冲区的逻辑结构应该是()。
A.队列 B.栈 C.线性表 D.有序表(8)设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是()。
C++中构造函数作⽤⼀、 构造函数是⼲什么的该类对象被创建时,编译系统对象分配内存空间,并⾃动调⽤该构造函数->由构造函数完成成员的初始化⼯作eg: Counter c1;编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调⽤构造函数Counter( )⾃动地初始化对象c1的m_value值设置为0故:构造函数的作⽤:初始化对象的数据成员。
⼆、 构造函数的种类class Complex{private :double m_real;double m_imag;public:// ⽆参数构造函数// 如果创建⼀个类你没有写任何构造函数,则系统会⾃动⽣成默认的⽆参构造函数,函数为空,什么都不做// 只要你写了⼀个下⾯的某⼀种构造函数,系统就不会再⾃动⽣成这样⼀个默认的构造函数,如果希望有⼀个这样的⽆参构造函数,则需要⾃⼰显⽰地写出来Complex(void){m_real = 0.0;m_imag = 0.0;}// ⼀般构造函数(也称重载构造函数)// ⼀般构造函数可以有各种参数形式,⼀个类可以有多个⼀般构造函数,前提是参数的个数或者类型不同(基于c++的重载函数原理)// 例如:你还可以写⼀个 Complex( int num)的构造函数出来// 创建对象时根据传⼊的参数不同调⽤不同的构造函数Complex(double real, double imag){m_real = real;m_imag = imag;}// 复制构造函数(也称为拷贝构造函数)// 复制构造函数参数为类对象本⾝的引⽤,⽤于根据⼀个已存在的对象复制出⼀个新的该类的对象,⼀般在函数中会将已存在对象的数据成员的值复制⼀份到新创建的对象中 // 若没有显⽰的写复制构造函数,则系统会默认创建⼀个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,具体原因请查询 有关 “浅拷贝” 、“深拷贝”的⽂章论述Complex(const Complex & c){// 将对象c中的数据成员值复制过来m_real = c.m_real;m_imag = c.m_imag;}// 类型转换构造函数,根据⼀个指定的类型的对象创建⼀个本类的对象,//需要注意的⼀点是,这个其实就是⼀般的构造函数,但是对于出现这种单参数的构造函数,C++会默认将参数对应的类型转换为该类类型,有时候这种隐私的转换是我们所不想要的,所以需要使⽤explicit来限制这种转换。
类:1、在类体中不允许对所定义的数据成员进行初始化。
2、类的成员函数描述类所表达的问题的行为。
类中所有的成员函数都必须在类体内进行说明。
但成员函数的定义既可以在类体内给出,也可以在类体外给出。
第一种方式是将成员函数直接定义在类的内部。
第二种方式是在类声明中给出对成员函数的说明,而在类外部对成员函数进行定义(但成员函数仍然在类范围内)。
这种在类外部定义的成员函数的一般格式是:<返回类型><类名>::<成员函数名>(<参数表>){<函数体>}在类体外定义成员函数时,要注意必须在成员函数名前加上类名和作用域运算符(::)。
作用域运算符用来标识某个成员属于某个类。
作用域运算符的使用格式如下:<类名>::<成员函数名>(<参数表>)或<类名>::<数据成员名>成员函数的两种定义方式之间是有差别的。
如果一个成员函数的声明和定义都在类体内,那么这个成员函数就是内联函数。
如果一个成员函数的声明在类体内,而定义在类体外,这时对该成员函数的调用是按一般函数进行的。
如果要将定义在类体外的成员函数也作为内联函数处理,就必须在成员函数的定义前加上关键字“inline”,以此显式地说明该成员函数也是一个内联函数。
成员函数除了可以定义为内联函数以外,也可以进行重载,可以对其参数设置默认值。
6.3 构造函数和析构函数1、构造函数和析构函数的定义。
构造函数的作用是在对象被创建时利用特定的值构造对象,将对象初始化为一种特定的状态,使该对象具有区别于其他对象的特征。
构造函数在对象被创建的时候由系统自动调用。
构造函数也是类的成员函数,但它是一种特殊的成员函数,它除了具有一般成员函数的特性之外,还具有一些特殊的性质:(1)构造函数的名字必须与类名相同;(2)构造函数不指定返回类型,它隐含有返回值,由系统内部使用;(3)构造函数可以有一个或多个参数,因此构造函数可以重载;(4)在创建对象时,系统会自动调用构造函数。
2、缺省构造函数和缺省析构函数缺省构造函数就是调用时不必提供参数的构造函数。