c c++学习笔记_第1页
c c++学习笔记_第2页
c c++学习笔记_第3页
c c++学习笔记_第4页
c c++学习笔记_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基本知识C与c+比较引入const常量和内联函数的定义,取代宏定义引入reference的概念,取代过于灵活的指针;引人动态内存分配运算符,取代比较低级的有关库函数;引入用于数据I/O的流类,取代c语言中可读性差的I/O库函数;第三章 函数Const保护参数实参不被修改传值调用与引用调用返回值为引用Double fun1();Double & fun2();Void()Double a =fun1();Double &b=a;初始化一个引用Double c=fun2();返回值Double &d=fun2();返回一个引用定义于函数外且用Static修饰的全局变量 具有文件作用域,只允许作用在

2、该变量的文件范围内访问,如果没有static修饰并在函数外部定义的变量,则访问没有限制,同一应用系统内任何程序文件中的任何函数都可以对其进行访问。通常把定义在函数外部的变量叫做全局变量。函数参数可以设置默认值,但是必须在在参数表的最右端出现内联函数主要是解决效率问题,一般以少于5句为宜。函数的嵌套调用和递归调用函数的定义不允许嵌套嵌套调用:顺序是ABC,返回则是CBA,定义是CBA递归调用:在调用一个函数的过程中直接或者间接调用该函数本身汉诺塔问题ABCA-(n-1)-B,n-C,BC#includevoid move(char getone,char putone)coutgetone”pu

3、toneendl;void hanoi(int n,char one char two,char three) void move(char getone,char putone);if(n=1)move(one,three);else Hanoi(n-1,one,three,two); Move(one,three);Hanoi(n-1,two,one,three);Void main() Void hanoi( int n,char one,char two,char three); Int I; CoutI;Cout”the steps to moving”i”diskes”endl;H

4、anoi(I,A,B,C);重载函数重载:不同实现的函数定义为相同的名字至少有参数个数 参数类型 参数排列顺序上不同不能用类型定义typedef语句中定的类型名来区别重载函数的参数运算符重载 operator对于每个对象的运算符一般需要重载,但是=和&不必用户重载;引用:类型 & 引用变量名= 已定义的变量(对象)名引用与函数的关系三个层次:1引用作为函数参数,2通过引用返回多个值,3返回值是引用引用型返回类型的函数调用可以作为左值表达式使用继承和派生私有 保护 公有多态性和虚函数多态是指同一消息被不同类型的对象接受时导致不同的行为,即成员函数的调用多态性类似于函数重载虚函数的作用:继承中有些

5、函数是不需要被派生类中适用的,派生类中需要另外设置成员函数,因此在基类中部分函数设置成虚函数,解决这个问题关联指的是确定调用的具体对象的过程:编译时确定调用的函数叫做静态关联,其支持的多态性叫做编译时的多态性;运行时的多态性是通过基类指针或者引用于虚函数的结合来实现的虚函数:只有类成员才能说明虚函数,仅适用于继承关系的类对象,所以普通函数不能说明为虚函数,且:同一类族中的类不能再定义一个非virtual的但与该虚函数具有形同的参数和函数返回值类型的同名函数构造函数不能为虚函数析构函数通常为虚函数静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象内联函数不能是虚函数,因为内联函数是不能在

6、运行中动态确定其位置的,即使虚函数在类的内部定义,编译时仍然将其看作是非内联的。纯虚函数Virtual 函数类型 函数名(参数表)= 0;在基类中只有函数名,无实体留给派生类定义才具备函数功能,之前不能被调用抽象类不用于定义对象而只作为一种基本类型用作继承的类,称为抽象类,常做基类,通常成为抽象基类函数模板:一系列相关函数的模板或者样板,这些函数的原代码相同,只是所针对的数据类型不同template函数定义每个模板参数有class修饰template 数据类型本身变成了参数T是个虚拟类型参数,用class修饰,编译程序时将每次调用时实际所使用的数据类型生成适当的调用代码,并生成相应的函数版本。

7、函数模板的实例化,每个实例就是一个模板函数,用实参的实际类型(如,int,long)等,替代虚拟类型 (如T)。函数模板提供了一组重载函数的样板,但比函数重载节省代码。函数模板与模板函数把实例化的函数模板称为模板函数函数类型和参数类型不具体指定,用一个虚拟的类型来代表函数模板的说明和定义必须是全局作用域,模板不能被说明为类的成员函数重载模板函数1 当只声明一个非模板函数的原型2定义一个完整的非模板函数在c+中,函数模板与同名的非模板函数重载时,调用的顺序遵循下述约定:1. 寻找一个参数完全匹配的函数,如果找到了就调用它2. 寻找一个函数模板,将其实例化,产生一个匹配的模板函数,若找到了它,就调

8、用它3. 若1和2都失败了,再试一试低一级的对函数的重载方法,例如通过类型转化可产生参数匹配,若找到了,调用它4. 否则,调用错误,或者在第一步有个多选择的调用,则是不明确的调用,是个错误的调用函数模板解决函数相同,算法相同,参数个数也相同而仅类型不同的问题,而重载函数主要解决函数名相同,算法相同,但参数个数或类型不同的问题。如果相互配合,则进一步扩大函数定义的适用范围函数模板中也允许使用多个类型参数类模板template class 类名类模板体定义;在类模板以外定义成员函数定义template 返回类型 类名 :成员函数(参数表)成员函数定义体;模板类的成员函数必须是函数模板类模板的实例化

9、:模板类类名 对象;类模板的派生template templateclass B:public A;/C语言第八章定义在函数体外的变量是全局变量,全局变量的作用范围从定义变量的地方开始直到本源文件结束。不成文规定,全局变量的第一个字母用大写表示全局变量在全部执行时都占用存储单元,模块要求内聚性强,耦合性弱同一个源文件中,外部变量与局部变量同名,在局部变量的作用范围内,外部变量被屏蔽,不起作用;变量的存储类别静态存储方式和动态存储方式全局变量放在静态存储区中,程序执行完毕释存储区,执行过程中占有固定的存储区,不是动态分配和释放动态存储区中放以下数据:函数形参自动变量(未加static声明的局部变

10、量)函数调用时的现场保护和返回地址数据类别和存储类型分为静态和动态,具体为四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)1. auto 动态分配内存2. static 函数调用完后保留原值,即占用的存储单元不释放,在下一次该函数调用时,该变量已有值,即上一次调用结束时的值;3. 静态局部变量属于静态存储类别,在静态存储区分配存储单元,在整个程序运行期间不释放,动态变量占用的是动态的存储类别,函数调用结束之后即释放4. 静态局部变量只保留上一次函数调用结束时的值,对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每次调用一次函数

11、重新给一个初值,相当于执行一次赋值语句5. 如果局部变量不赋初值,则对静态局部变量来说,编译时自动赋初值0,或者空字符,自动变量来说如果不赋初值,他的值是不确定的一个值6. 静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的7. register变量:只有局部自动变量和形式参数可以作为寄存器变量,其他不行(如全局变量)/不是很需要8. extetn 外部变量。作用:(1)扩展作用域。引用之前用关键字extern对该变量作外部变量声明。(2)在多个文件的程序中声明外部变量:在一个文件中定义外部变量num,在另一个文件中用extern对num作外部变量声明9. 用static声明外部变

12、量具有文件作用域。只要是外部变量都是静态存储方式,加static是指作用范围不同,都是编译时分配内存10. 变量的声明和定义:把建立存储空的声明称定义,把不需要建立存储空间的声明称声明11. 所谓声明是声明该变量是一个已经在后面定义过的外部变量,仅仅是为了提前引用该变量而作的的声明,extern只用作声明,而不用作定义12. 用auto,register, static声明变量时,是定义在变量的基础上加上这些关键字,而不能单独使用。函数内部函数:只能在本文件中用,前面加static以修饰外部函数:在函数前加extern表示可供其他文件使用如果函数在定义时省略extern ,则又隐含为外部函数;

13、运行一个多文件的程序1. turbo c环境 将文件名写在同一行上面,将以上内容存盘,更改扩展名,.prj,按F9,进行编译连接,ok2. MS C平台上link 文件名+。得到一个可执行的文件 exe,运行它3. 用#include 命令 将其他文件包含在一个文件中,作为整体编译第九章 预处理命令宏定义1.未加参数的宏定义#define 标识符 字符串(不加分号哦)1.有效范围为定义命令之后到本文件结束2.可以用#undef 命令终止宏定义的作用域define G。#undef G3.进行宏定义时可以引用已定义的宏名,可以层层置换4. 程序中被用双撇括号起来的字符串内的字符,即使与宏名相同,

14、也不进行置换5. 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间带参数的宏定义#define 宏名(参数表)字符串1. 在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分宏和函数的区别1. 函数调用时,先求出实参表达式的值,然后带入形参;但是使用带参数的宏只是作简单的字符替换,2. 函数调用是在运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存空间,不进行值的传递处理,也没有“返回值”的概念;3. 函数中形参和实参是都要进行定义的,类型要求一致,而宏不存在类型的问题,

15、宏名无类型,它的参数也无类型,姿势一个符号代表,4. 调用函数只返回一个值,而用宏可以设法得到几个结果5. 使用宏次数多时,宏展开后源程序加长,函数不会6. 宏不占用运行时间,只占编译时间,而函数调用占用运行时间#define MAX(x,y) (x)(y)?(x):(y)文件包含#include 尖括号表示时,系统到存放c库函数头文件所在的目录中寻找要包含的文件,这是标准方式;用双撇号,系统在用户当前目录中讯号要包含的文件,若找不到,再按照标准方式查找。预编译功能是c语言特有的,有利于程序的可移植性,增加程序的灵活性条件编译:对文件中的一部分内容只在满足一定条件下才进行的编译,也就是对一部分

16、内容指定的编译的条件1.#ifdef 标识符程序段1#else 程序段2#endif2.#ifndef 标识符程序段1#else 程序段2#endif这个与1相反,表示标识符未被定义则编译程序段1,否则23.#if 表达式程序段1#else 程序段2#endif作用是当表达式值为真(非零)时就编译程序段1,否则编译程序段2第十章 指针变量的指针就是变量的地址存放变量地址的变量是指针变量,用来指向另一个变量。指针变量的引用:指针变量中只能存放地址(指针),不要将一个整形量(或者其他数据)赋给一个指针变量。&取址*指针运算符,取指针变量所指向的存储单元&和*同一个优先级,从右向左结合+和*同一优先

17、级,从右向左结合指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量发生变化,函数调用后,这些变量值的变化依然会保存下来,这样就实现了通过调用函数使变量值发生变化,在主调函数中使用这些改变了的值的目的了。(指向同一个内存单元)不能企图通过改变指针形参的值而使指针实参的值改变C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量做函数参数也要遵循这一原则。调用函数不能改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。指针与数组其实是变址运算符*p+=*(p+),先取*p,再加1;*(+p)(*p)+,p指向的元素值加1采用数组名作函数参数,如果形参数组中各元素

18、的值发生变化,实参数组元素的值随之变化。多维数组与指针二维数组中a+i表示第i行首地址ai,这个表示第i行首地址;ai+j=aij的地址;a0+1=*(a+0)+1=&a01;*(a+i)=ai;为ai的地址a,a+i,ai,*(a+i),*(a+i)+j,ai+j都是地址,因为二维ai代表第i行的首地址P226: 二维数组名如a是指向行的,因此a+1中1代表一行中全部元素所占的字节数以为数组名是指向列的,a0+1中的1代表一个元素所占的字节数。在指向行指针前加一个*,就转换成指向列的指针,在指向列的指针前面加&,就成为指向行的指针。&ai不是简单的ai单元的物理地址,因为并不存在ai这样一个

19、实际的变量。它只是一种地址的计算方法,&ai和ai的值是一样的,但是它们的含义是不同的&ai或者a+i指向行,而ai或者*(a+i)指向列。当j为0时,他们值相等,指向同一地址值,但应注意所指向对象 是不同的。指向函数的指针 int(*p)( ) 存放的是函数的地址,他可以先后指向返回类型相同的不同的函数若 为int *p( ) 则表示声明一个函数,函数的返回值是一个指向int型的指针变量函数指针*p 则就是调用函数,它只能指向函数的入口而不能指向函数中间的某一条指令处,因此不能用*(p+1)来表示函数的下一条指令对于指向函数的指针变量,像p+n这些是无意义的用指向函数的指针作函数参数 实现函数地址的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论