《《C基础知识》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C基础知识》PPT课件.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+基础知识张涛08.11.10东华理工大学核工程技术学院全面支持C C+语言的产生语言的产生 1983加入类CC+ANSI C+1994标准化C+语言的特点语言的特点 面向对象,也可用于面向过程的结构化程序设计也可用于面向过程的结构化程序设计比C更完善、安全、高效 面向对象的基本概念面向对象的基本概念 对象对象是用来描述客观事物的一个实体张三李四属性服务性别,年龄说话,行走抽象类类是具有相同属性和服务的一组对象的概括具体化继承新类新类人说话,行走性别,年龄大学生性别,年龄,专业说话,行走,学习消息预处理命令用来定义某些编译内容要在满足一定条件下才参与编译,否则不参与编译;可使同一源程序在不同
2、的编译条件下产生不同的目标代码。预处理命令不是C+语言的一部分;常用的预处理命令文件包含命令宏定义命令条件编译命令停止编译命令避免重复引用某个头文件(条件编译和文件包含)/main.cpp#include myfile1.h#include myfile2.h/myfile1.h#include myhead.h/myfile2.h#include myhead.h改进:/myfile1.h#ifndef MYHEAD_H#define MYHEAD_H#include myhead.h#endif/myfile2.h#ifndef MYHEAD_H#define MYHEAD_H#inclu
3、de myhead.h#endif C+的数据类型指针一个变量的地址称为该变量的“指针”。指针是C+对内存地址的一种抽象。指针变量是一种存放内存地址的变量,在C+中指针的值就是地址。指针的一般定义形式为:数据类型 *变量名其中的数据类型可以是C+中的任何一种数据类型,*是“指向”的意思。例如:int a,*p1,*p2;p1&a;引用说明 int num=50;int&ref=num;表示放整数 50 的内存空间 可叫 num,又可叫 ref 引用实质上是为另一个变量建立别名。引用引用是一种数据形式,使用场合有引用变量、引用参数、引用函数返回值等。引用引用最大的作用就是作为函数的参数与返回值。
4、引用作为函数参数,有以下好处:引用引用参数传递的就是参数本身,而不是实在参数的一个副本,这样减少了建立副本的消耗。引用引用作为参数还可以作为函数返回值的一种有效途径。可以通过将引用定义为是const引用来限制在函数中对引用所代表的实在参数做修改。引用常类型常类型:使用类型修饰符const说明的类型;常类型的变量或对象的值是不能被更新的;定义或说明常类型时必须初始化;const修饰其左边的类型;一般常量(简单类型的常量)const 或const int const x=2;或const int x=2;int const a3=1,2,3;或const int a3=1,2,3;数组元素的值是常
5、量,不能更新;常对象 const class Aint x,y;public:const A a1(3,4);A(int i,int j)x=i;y=j;private:A const a1(3,4);常对象A常指针char*const ptr1=strptr1;ptr1是一个常量指针;ptr1=strptr2;*ptr1=m;ptr1不可以更新ptr1所指向的变量可以更新;const的位置const char*ptr2=strptr1;ptr2是一个指向字符串常量的指针;ptr2=strptr2;*ptr2=m;ptr2可以更新ptr2所指向的字符串不可以更新;错误正确正确错误常引用常引用所
6、引用的对象不能被更新;const&double x=1.2;const double&v=x;则:v=12.3错误。使用常参数表明该函数不会更新某个参数所指向或所引用的对象,并使该函数具有更大的适应性;常指针。#include const int N=6;void print(const int*p,int n);void main()int arrayN;for(int i=0;iarrayi;print(array,N);void print(const int*p,int n)cout*p;for(int i=0;iN;i+)cout,*(p+1);coutendl;整型常量常指针作形参
7、输入:1 2 3 4 5 6输出:1,2,3,4,5,6形参为常指针,实参为一般数组常成员函数使用const关键字进行说明的成员函数;()const;const是函数类型的一个组成部分,在函数实现部分必须带有const关键字;说明:只有常成员函数才能操作常对象;成员函数与对象之间的操作关系#include class Kpublic:K(int i)k=i;int setk()const return k;private:int k;int add(const K&g1,const K&g2);void main()K k1(8),k2(17);常成员函数常引用作形参 int s=add(k1
8、,k2);coutsendl;int add(const K&g1,const K&g2)int sum=g1.setk()+g2.setk();return k;形参为常引用,实参为非常对象类型适应输出25C运算符函数C+语言认为函数是一个能完成某一独立功能的子程序,也就是程序模块。函数就是对复杂问题的一种“自顶向下,逐步求精”思想的体现。编程者可以将一个大而复杂的程序分解为若干个相对独立而且功能单一的小块程序(函数)进行编写,并通过在各个函数之间进行调用,来实现总体的功能。使用函数的优点:(1)可读性好;(2)易于查错和修改;(3)便于分工编写,分阶段调试;(4)各个函数之间接口清晰,便于
9、相互间交换信 息和使用;(5)节省程序代码和存储空间;(6)减少用户总的工作量;(7)成为实现结构程序设计思想的重要工具;(8)扩充语言和计算机的原设计能力;(9)便于验证程序正确性。在C+程序中调用函数之前,首先要对函数进行定义。如果调用此函数在前,函数定义在后,就会产生编译错误。为了使函数的调用不受函数定义位置的影响,可以在调用函数前进行函数的声明。这样,不管函数是在哪里定义的,只要在调用前进行函数的声明,就可以保证函数调用的合法性。函函数数原原型型是是一一条条以以分分号号结结束束的的语语句句,实实际际上上就是所定义函数的函数头,形如:就是所定义函数的函数头,形如:函数返回值类型函数返回值
10、类型 函数名函数名 (形参表形参表 )其中形参表可以逐个列出每个参数的类型和参数名,其中形参表可以逐个列出每个参数的类型和参数名,也可以列出每个形参的类型,也可以列出每个形参的类型,参数名可省略参数名可省略,各形参之间,各形参之间以逗号分隔。函数原型和所定义的函数必须在返回值类型、以逗号分隔。函数原型和所定义的函数必须在返回值类型、函数名、形参个数和类型及函数名、形参个数和类型及次序次序等方面完全对应一致,否等方面完全对应一致,否则将导致编译错误。则将导致编译错误。C+中函数定义格式如下:存储类型存储类型 函数类型函数类型 函数名函数名()/函数定义头函数定义头/函数定义体函数定义体 说明语句
11、;说明语句;表达式语句;表达式语句;return 表达式表达式;返回值类型返回值类型在上述格式中,函数的存储类型可以缺省,但函数类型、函数名和参数表不能省略。参数表中列举函数的所有参数,函数也可以没有参数,但此时函数名后面的圆括号()仍不可少。例如:int max(int a,int b)int t;if(ab)t=a;else t=b;return t;类型就是该函数的类型,也就是该函数的返回值的类型,此类型可以是C+中除函数、数组类型之外的任何一个合法的数据类型。函数的返回值通常指明了该函数处理的结果,由函数体中的return语句给出。一个函数可以有返回值,也可以无返回值。此时需要使用保留
12、字void作为类型名。每个函数都有类型,如果在函数定义时没有明确指定类型,则默认类型为int。函数调用的格式:函数调用的格式:在C+中,除了主函数main由系统自动调用外,其他函数都是由主函数直接或间接调用的。函数调用的语法格式为:函数名(实际参数表);实参应该与函数定义中的形参表中的形参一一对应,即个数相等、次序一致且对应参数的数据类型相同或相容。每个实参是一个表达式,并且必须有确定的值。函数调用时的参数传递函数调用时的参数传递参数传递称为“实虚结合”,即实参向形参传递信息,使形参具有确切地含义(即具有对应的存储空间和初值)。这种传递又分为两种不同的方式,一种是按值传递,另一种是地址传递或引
13、用传递。1.按值传递按值传递被调用函数本身不对实参进行操作,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。按值传递例子#include iostream.hvoid swap(int,int);void main()int a=3,b=4;couta=a,b=“bendl;swap(a,b);couta=a,b=b endl;voidswap(intx,inty)intt=x;x=y;y=t;此程序的运行结果为:此程序的运行结果为:a=3,b=4a=3,b=42.地址传递地址传递如果在函数定义时将形参的类型说明成指针,它把实参的存储地址传送给对应的形参,从而使得形
14、参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。#include iostream.hvoid swap(int*,int*);void main()int a=3,b=4;couta=a,b=“bendl;swap(&a,&b);couta=a,b=“bendl;voidswap(int*x,int*y)intt=*x;*x=*y;*y=t;此程序的运行结果为:此程序的运行结果为:a=3,b=4a=4,b=3按地址传递例子3.引用传递引用传递按值传递方式容易理解,但形参值的改变不能对实参产生影响;地址传递方式虽然可以使得形参的改变对相应
15、的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序容易产生错误且难以阅读。如果以引用作为参数,则既可以使得对形参的任何操作都能改变相应的实参的数据,又使函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。#include iostream.hvoid swap(int&,int&);void main()int a=3,b=4;couta=a,b=“bendl;swap(a,b);couta=a,b=“bendl;voidswap(int&x,int&y)intt=x;x=y;y=t;此程序的运行结果为:此程序的运行结果为:a=3,b=4a=4,b=3按
16、引用传递例子 内联函数内联函数内联扩展(inline expansion)简称为内联(inline),内联函数也称为内嵌函数。当在一个函当在一个函数的定义或声明前加上关键字数的定义或声明前加上关键字inline则就把该函数则就把该函数定义为内联函数,它主要是解决程序的运行效率定义为内联函数,它主要是解决程序的运行效率。若把一个函数定义为内联函数后,在程序编译在程序编译阶段阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,由此省去函数的调用及相应的保存现场、参数传递和返回操作,从而加快整个程序的执行速度。类类是通过抽象数据类型的方法来实现的一种数据类型;类是对某一类对象的抽象,
17、对象是某一种类的实例;类是一种复杂数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体;类封装了操作操作和数据数据,用函数来实现类的操作成员,用各种数据类型表示类的数据成员;一个纯粹的面向对象的程序就是由若干类类的定义组成。构成程序的各个文件就是用于定义各个类。头文件就是类的定义文件。类的定义格式说明部分:说明该类中的成员,包含数据成员的说明和成员函数的说明;实现部分:对成员函数的定义;1、类定义格式的构成2、类的一般定义格式class public:private:;访问权限类定义关键字说明部分实现部分语句结束符class TDatepublic:void SetDate(
18、int y,int m,int d);int IsLeapYear();void Print();private:int year,month,day;void TDate:SetDate(int y,int m,int d)year=y;month=m;day=d;int TDate:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0)void TDate:Print()coutyear.month.dayendl;成员函数定义成员函数定义作用域运算符成员函数定义作用域运算符:标识某个成员属于哪个类;:()class N;class Mp
19、ublic:.private:N*n;class Npublic:void f(M m);提前说明类N自身类的指针或引用,可以作该类的成员;当另一个类的对象作为该类的成员时,如果另一个类的定义在后,需要提前说明;习惯将类定义的说明部分或者整个定义部分(包含实现部分)放到一个头文件中;n是N类的对象m是M类的对象对象的定义格式;例如:TDate date1,date2,*Pdate,date31;-运算符与.运算符的区别-表示指向对象的指针的成员;.表示一般对象的成员;两种等价表示-(*).1、一般对象数据成员:.成员函数:.().运算符:表示对象的成员例如:date1.year,date1.m
20、onth,date1.day;date1.SetDate(1998,4,9);2、指针对象数据成员:-成员函数:-()-运算符:表示对象的成员例如:Pdate-year,Pdate-SetDate(1998,4,9);#include#include tdate.hvoid main()TDate date1,date2;date1.SetDate(1996,5,4);date2.SetDate(1998,4,9);int leap=date1.IsLeapYear();coutleapendl;date1.Print();date2.Print();输出:11996.5.41998.4.9构
21、造函数和析构函数 构造函数是成员函数,函构造函数是成员函数,函数体可写在类体内,也可数体可写在类体内,也可写在类体外;写在类体外;构造函数的特点析构函数的特点 构造函数的构造函数的名字与类名字与类名相同名相同;析构函数的析构函数的名字名字在在类类名前加名前加 字符;字符;析构函数是成员函数,析构函数是成员函数,函数体可写在类体内,函数体可写在类体内,也可写在类体外;也可写在类体外;构造函数构造函数不指定返回不指定返回类型类型,它有隐含的返,它有隐含的返回值,该值由系统内回值,该值由系统内部使用;部使用;析构函数析构函数不指定返回不指定返回类型类型;构造函数可以有一个或多构造函数可以有一个或多个
22、参数;个参数;构造函数构造函数可以重载可以重载;一个类中只能定义一个类中只能定义一一个析构函数个析构函数;析构函数析构函数没有参数没有参数;程序中不能直接调用程序中不能直接调用构造函数,构造函数,在创建对在创建对象时系统自动调用象时系统自动调用构构造函数;造函数;析构函数析构函数在对象存在在对象存在的函数体结束时的函数体结束时或或使使用用deletedelete运算符释放运算符释放newnew运算符创建的对运算符创建的对象时象时被自动调用;被自动调用;class TDate1public:TDate1(int y,int m,int d);TDate1();void Print();priva
23、te:int year,month,day;TDate1:TDate1(int y,int m,int d)year=y;month=m;TDate1:TDate1()TDate1:TDate1()coutDestructor called.endl;coutDestructor called.endl;构造函数 初始化析构函数拷贝初始化构造函数1、功能用一个已知的对象来初始化一个被创建的同类对象;2、特点函数名同类名,无返回类型;只有一个参数,是对某个对象的引用;每个类都必须有一个拷贝初始化构造函数;:(const&)3、缺省拷贝初始化构造函数如果类中没有说明拷贝初始化构造函数,则编译系统自
24、动生成一个具有上述形式的缺省拷贝初始化构造函数,作为该类的公有成员;/tpoint.hclass TPointpublic:TPoint(int x,int y)X=x;Y=y;TPoint(TPoint&p);TPoint()coutDestructor called.endl;int Xcoord()return X;int Ycoord()return Y;private:int X,Y;分析下列程序的输出结果。构造函数拷贝初始化构造函数TPoint:TPoint(TPoint&p)X=p.X;Y=p.Y;coutCopy_initialization Constructor calle
25、d.n;#include#include tpoint1.hTPoint f(TPoint Q);void main()TPoint M(20,35),P(0,0);TPoint N(M);M为已知对象,N是正在创建的对象 P=f(N);coutP=P.Xcoord(),P.Ycoord()endl;TPoint f(TPoint Q)coutOK!endl;int x,y;x=Q.Xcoord()+10;y=Q.Ycoord()+20;TPoint R(x,y);return R;传值调用将R的值作为返回值输出:Copy_initialization Constructor called.C
26、opy_initialization Constructor called.OK!Copy_initialization Constructor called.Destructor called.Destructor called.Destructor called.P=30,55Destructor called.Destructor called.Destructor called.匿名对象4、使用拷贝初始化构造函数初始化的三种情况明确表示由一个对象初始化另一个对象时;例如:TPoint N(M);当对象作为函数实参传递给函数形参时(传值调用);例如:P=f(N);当对象作为函数返回值时(
27、数据值);例如:return R;赋值1、功能用于更新类类型的对象;2、特点该函数的函数名是一个操作符,必须与关键字operator合用;该函数只有一个参数,是对该类某个对象的常引用;一般赋值操作返回对被赋值对象的引用;类中未声明赋值操作时,编译器自动生成一个公有的赋值操作;赋值操作的等价表示形式:&:operator=(const&)B=A;等价于B.operator=(A);每个类都有一个赋值操作;#include class Locationpublic:Location(int xx=0,int yy=0)X=xx;Y=yy;Location(Location&p)X=p.X;Y=p.
28、y;Location&operator=(Location&p);int GetX()return X;int GetY()return Y;private:int X,Y;分析下列程序的输出结果。赋值函数Location&Location:operator=(Location&p)X=p.X;Y=p.Y;coutAssignment operator called.endl;return*this;void main()Location A(1,2),B;B=A;coutB=B.GetX(),B.GetY()endl;输出Assignment operator called.B=1,23、何
29、时需要在类中定义拷贝初始化和赋值操作当类中声明有指针数据成员时,必须定义拷贝初始化和赋值操作,否则编译器生成的拷贝初始化操作和赋值操作的执行将导致程序在运行时产生问题;class AA:A(int i)public:p=new int(i);A(int i);A();A:A()private:int*p;delete p;void main()A a(5);A b(a);.A c(5),d(10);d=c;.;拷贝初始化:a和b对象的指针指向同一个对象,执行析构函数将删除同一个对象两次;赋值:d对象的p指针被更新为c对象的p指针的值,则:(1)d对象的p指针原先所指向的值将无法访问;(2)执行
30、析构函数将删除同一个对象两次;5a.pb.p510c.pd.pd.p/修改A:A(A&r)p=new int(*r.p);A&A:operator=(A&r)if(this=&r)return*this;p=r.p;return*this;5a.p510c.pd.p5b.p5基类和派生类1、基类与派生类基类(父类):已存在的用来派生新类的类;派生类(子类):由已存在的类派生出的新类;2、单继承与多继承单继承:从一个基类派生的继承;多继承:从多个基类派生的继承;基类派生类ABACB单继承多继承基类是对若干个派生类的抽象,而派生类是基类的具体化;基类抽取了它的派生类的公共特征,而派生类通过增加行为将抽象类变为某种有用的类型。派生类将其自身与基类区别开来的方法是添加数据成员和成员函数;1、单继承class:;2、多继承class:,.;继承方式public:公有继承;private:私有继承;protected:保护继承;作用:控制基类中声明的成员在多大的范围内能被派生类的用户访问;私有成员公有成员保护成员私有成员公有成员保护成员基类部分新定义部分派生类派生类成员派生类的构成