C++个人笔记.docx
- 文档编号:29258564
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:19
- 大小:114.22KB
C++个人笔记.docx
《C++个人笔记.docx》由会员分享,可在线阅读,更多相关《C++个人笔记.docx(19页珍藏版)》请在冰豆网上搜索。
C++个人笔记
1.布尔型(逻辑型)的用法
逻辑型变量要用类型标识符bool来定义,它的值只能是true(真)和false(假)之一。
如
boolfound,flag=false;
//定义逻辑变量found和flag,并使flag的初值为false
found=true;//将逻辑常量true赋给逻辑变量found
在编译系统处理逻辑型数据时,将false处理为0,将true处理为1。
因此,逻辑型数据可以与数值型数据进行算术运算。
如果将一个非零的整数赋给逻辑型变量,则按“真”处理,如
flag=123;//赋值后flag的值为true
cout< 逻辑运算结果不是0就是1,不可能是其他数值。 而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真”对待)。 2.条件表达式(? : )的运用 条件表达式的一般形式为: 表达式1? 表达式2∶表达式3 条件运算符的执行顺序是: 先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。 若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。 例1: “(a>b)? a: b”是一个“条件表达式”。 它是这样执行的: 如果(a>b)条件为真,则条件表达式的值就取“? ”后面的值,即条件表达式的值为a,否则条件表达式的值为“: ”后面的值,即b。 3.switch语句的注意事项 (1)多个case可以共用一组执行语句,如 case′A′: case′B′: case′C′: cout<<″>60\n″;break; ... 含义是当grade的值为′A′、′B′或′C′时都执行同一组语句。 补充说明: “cout<<′\n′”将输出一个换行,其作用与“cout< ″a″和′a′代表不同的含义,″a″是字符串常量,′a′是字符常量。 前者占两个字节,后者占1个字节。 4.do-while语句的介绍 基本结构形式 do 语句 while(表达式); 它是这样执行的: 先执行一次指定的语句(即循环体),然后判别表达式,当表达式为真(非0)时,返回重新执行循环体语句,如此反复,直到表达式为假(0)为止,此时循环结束。 4.实参和形参 (1)实参可以是常量、变量、表达式、函数调用、数组元素、数组名, 表达式作为函数的实参。 如 表达式作为函数实参,如 max(3,a+b);但要求a和b有确定的值。 以便在调用函数时将实参的值赋给形参。 函数调用作为一个函数的实参。 如 m=max(a,max(b,c));//max(b,c)是函数调用,其值作为外层max函数调用的一个实参 数组元素也可以作函数实参。 如 max=max_value(a[i][j],max);//调用max_value函数 //函数调用,数组名作实参 数组名也可以作实参和形参,传递的是数组的起始地址 如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定第二维(即列)的大小,且应与实参的第二维的大小相同。 第一维的大小可以指定,也可以不指定。 如 intarray[3][10];//形参数组的两个维都指定 或intarray[][10];//第一维大小省略 (2)形参可以是常量、变量、表达式、函数调用、数组元素、数组名、指针变量 如,voidswap(int*p1,int*p2);//函数声明 调用结束后,形参单元被释放,实参单元仍保留并维持原值。 因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。 5.C++的函数模版 C++提供了函数模板(functiontemplate)。 所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。 这个通用函数就称为函数模板。 凡是函数体相同的函数(只是输入参数、输出参数的类型不同而已)都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。 在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。 #include usingnamespacestd; template Tmax(Ta,Tb,Tc)//定义一个通用函数,用T作虚拟的类型名 {if(b>a)a=b;//T可以取int、double、float等 if(c>a)a=c; returna; } 后面省略 用函数模板比函数重载更方便,程序更简洁。 但应注意它只适用于函数的参数个数相同而类型不同,且函数体相同的情况,如果参数的个数不同,则不能用函数模板。 6.外部变量的用法 (1)如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量num,不能分别在两个文件中各自定义一个外部变量num。 正确的做法是: 在任一个文件中定义外部变量num,而在另一文件中用extern对num作外部变量声明。 即 externintnum; (2)有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。 这时可以在定义外部变量时加一个static声明。 这种加上static声明、只能用于本文件的外部变量(全局变量)称为静态外部变量。 7.内部函数和外部函数 根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。 如果一个函数只能被本文件中其他函数所调用,它称为内部函数,内部函数又称静态(static)函数。 在定义内部函数时,在函数名和函数类型的前面加static。 函数首部的一般格式为: static类型标识符函数名(形参表) 如staticintfun(inta,intb) 外部函数: 在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。 其实定义的函数默认是外部函数,所以extern可以省略。 在需要调用此函数的文件中,用extern声明所用的函数是外部函数。 如函数首部可以写为 externintfun(inta,intb) 8.数组的大小、引用、赋值规定 C++不允许对数组的大小作动态定义,即必须事先指定数组的大小,如a[10]。 只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。 下标可以是整型常量或整型表达式。 例如a[6]、a[2*3] 在对全部数组元素赋初值时,可以不指定数组长度。 例如 inta[5]={1,2,3,4,5};可以写成inta[]={1,2,3,4,5}; 字符数组的赋值与引用只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。 如 charc[5]; c={′C′,′h′,′i′,′n′,′a′};//错误,不能对整个数组一次赋值 c[0]=′C′;c[1]=′h′;c[2]=′i′;c[3]=′n′;c[4]=′a′;//对数组元素赋值,正确 9.测量字符串的长度 字符数组可以存放一个字符串中的字符。 如 charstr[12]={′I′,′′,′a′,′m′,′′,′h′,′a′,′p′,′p′,′y′}; 为了测定字符串的实际长度,C++规定了一个“字符串结束标志”,以字符′\0′代表。 注,当对字符数组元素部分赋值时,系统对字符数组的后面元素自动填补空字符′\0′。 10.字符串类型的定义及其用法 字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量 (1)可以对字符串变量中某一字符进行操作,如 stringword=″Then″;//定义并初始化字符串变量word word[2]=′a′;//修改序号为2的字符,修改后word的值为″Than″ (2)字符串复制用赋值号,如 string1=string2;其作用与“strcpy(string1,string2);”相同。 (3)字符串连接用加号,如 stringstring1=″C++″;//定义string1并赋初值 stringstring2=″Language″;//定义string2并赋初值 string1=string1+string2;//连接string1和string2 连接后string1为″C++Language″。 (4)字符串比较直接用关系运算符 可以直接用==(等于)、>(大于)、<(小于)、! =(不等于)、>=(大于或等于)、<=(小于或等于)等关系运算符来进行字符串的比较。 (5)用string定义字符串数组。 如 stringname[5];//定义一个字符串数组,它包含5个字符串元素 stringname[5]={″Zhang″,″Li″,″Fun″,″Wang″,″Tan″}; //定义一个字符串数组并初始化 注意: 在一个字符串数组中包含若干个(现为5个)元素,每个元素相当于一个字符串变量,而不是一个字符,并不要求每个字符串元素具有相同的长度,每一个字符串元素中只包含字符串本身的字符而不包括′\0′。 11.指针变量 定义: 如果有一个变量是专门用来存放另一变量地址(即指针)的,则它称为指针变量。 指针变量的值(即指针变量中存放的值)是地址(即指针。 指针变量是一种特殊的变量,用它来指向另一个变量(的数值)。 形式: 在定义变量时在变量名前加一个“*”表示该变量是指针变量。 在C++中用“*”符号表示指向,例如,i_pointer是一个指针变量,而*i_pointer表示i_pointer所指向的变量(的值)。 实际应用 int*pointer_1;//int是指: 所定义的指针变量是指向整型数据的指针变量 float*pointer_3;//pointer_3是指向单精度型数据的指针变量 char*pointer_4;//pointer_4是指向字符型数据的指针变量 pointer_1=&i;//将变量i的地址存放到指针变量pointer_1中 补充说明: &取地址运算符;*指针运算符(或称间接访问运算符)。 例如: &a为变量a的地址,*p为指针变量p所指向的变量。 如果已执行了“pointer_1=&a;”语句,则&*pointer_1与&a相同,即变量a的地址。 *&a与*pointer_1的作用是一样的,它们等价与变量a。 对*&a的正确理解是,先进行&a的运算,得a的地址,再进行*运算,即&a所指向的变量,即是a。 指针变量作为函数参数的分析 函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作函数参数,就可以通过指针变量改变主调函数中变量的值,相当于通过函数调用从被调用的函数中得到多个值。 指针变量的指向 (1)指向一个函数。 一个函数在编译时被分配给一个入口地址。 这个函数入口地址就称为函数的指针。 可以用一个指针变量指向函数,然后通过该指针变量调用此函数。 指向函数的指针变量的一般定义形式为 函数类型(*指针变量名)(函数形参表) 例如,int(*p)(int,int);p是指向函数的指针变量 指针函数 函数指针(指向函数的指针变量)的本质为一个指针变量,其内部存储的是函数于内存中的地址。 用法: int func(int x); // 声明一个函数 int (*f) (int x); //声明一个函数指针 f=func; //将func函数的首地址赋给指针f ,func和f俩者就是名字比较像,其本质完全不同,一个是函数,一个是变量。 返回指针值的函数简称为指针函数。 定义指针函数的一般形式为 类型名*函数名(参数表列); 例如 int*max(intx,inty); 12.引用的用法 引用是一种新的变量类型,它的作用是为一个变量起一个别名。 假如有一个变量a,想给它起一个别名b,可以这样写: inta;//定义a是整型变量 int&b=a;//声明b是a的引用 以上语句声明了b是a的引用,即b是a的别名。 经过这样的声明后,a或b的作用相同,都代表同一变量,一个变量的数值改变另一个变量的数值也相应改变,也就是说a与b是等价的。 当然,引用不仅可以用于变量,也可以用于对象。 注意: 在上述声明中,&是引用声明符,并不代表地址。 b和a具有同一地址。 声明b是a的引用,可以理解为: 使变量b具有变量a的地址。 见下图所示,如果a的值是20,则b的值也是20。 C++之所以增加引用类型,主要是把它作为函数参数,以扩充函数传递数据的功能。 13.函数参数传递 (1)将变量名作为实参和形参。 这时传给形参的是变量的值,传递是单向的。 如果在执行函数期间形参的值发生变化,并不传回给实参。 因为在调用函数时,形参和实参不是同一个存储单元。 采用值传递的方式 (2)传递变量的指针。 形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。 采用地址传递的方式 地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。 因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。 (3)如果以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。 引用传递方式是在函数定义时在形参前面加上引用运算符“&”。 (引用指向同一地址)。 14.结构体介绍 声明一个结构体类型的一般形式为 struct结构体类型名 {成员表列}; 例如 structStudent//声明一个结构体类型Student {intnum;//包括一个整型变量num charname[20];//包括一个字符数组name,可以容纳20个字符 charsex;//包括一个字符变量sex intage;//包括一个整型变量age floatscore;//包括一个单精度型变量 charaddr[30];//包括一个字符数组addr,可以容纳30个字符 };//最后有一个分号 补充说明: (1)结构体的成员既可以包括数据(即数据成员),又可以包括函数(即函数成员),以适应面向对象的程序设计。 但是由于C++提供了类(class)类型,一般情况下,不必使用带函数的结构体,或者说一般情况下,结构体中只包括数据。 (2)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。 例如 student1=student2; (3)可以引用一个结构体变量中的一个成员的值。 例如,student1.num表示结构体变量student1中的成员的值。 引用结构体变量中成员的一般方式为 结构体变量名.成员名 结构体变量只能对结构体变量中的各个成员分别进行输入和输出。 不能作为一个整体进行输入和输出。 例如,不能企图这样输出结构体变量中的各成员的值: cout< (4)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算种类)。 例如 student2.score=student1.score; sum=student1.score+student2.score; student1.age++; ++student1.age; student1.age++相当于(student1.age)++ (5)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 如 cout<<&student1;//输出student1的首地址 cout<<&student1.age;//输出student1.age的地址 15.C++编译、运行、注释的基础知识 编译是以源程序文件为单位分别编译的。 目标程序一般以.obj或.o作为后缀(object的缩写) 运行最终形成的可执行的二进制文件(.exe文件),得到运行结果。 “//”作注释时,有效范围只有一行,即本行有效,不能跨行。 而用“/*……*/”作注释时有效范围为多行 多个变量赋初值 方法1: floata=4.5,b=4.5,c=4.5;方法2: floata,b,c=4.5; 头文件的使用 使用系统标准数学函数sin、cos等,在本程序开头加上#include 使用了控制符,如setpresicion、setw在本程序开头加上#include 数据类型的判断 (1)两个整数相除的结果为整数,如5/3的结果值为1,舍去小数部分。 (2)如果参加+,-,*,/运算的两个数中有一个数为float型数据,则运算的结果是double型,因为C++在运算时对所有float型数据都按double型数据处理。 逗号表达式的使用 逗号运算符连接逗号表达式,逗号表达式又称“顺序求值运算符”(从左到右),逗号表达式的求解过程是: 先求解表达式1,再求解表达式2。 整个逗号表达式的值是表达式2的值。 如,逗号表达式a=3*5,a*4若a等于1,则整个逗号表达式的值为60 16.常用函数、变量、类型的用法说明 (1)setw()只对紧跟在他后面的数据有效,给紧跟着后面的数据预定一个空间(设置输出数据的长度),如果该数据小于这个空间,在左边用0补齐;cout< 结果: (两个空格)54421(一个空格)356 setiosflags(iso: : fixed)设置定点形式输出,即不会表示成科学计数。 该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧; setiosflags(ios: : scientific)是用指数方式表示实数 (3)int整形,也就是整数,是有符号的 float单精度浮点数,也就是小数,一般占4个字节 double双精度浮点数,也是小数,不过范围比float大得多,一般占8个字节 (4)void是空的意思,一般用来表示无参数、无类型或者无返回。 比如在函数定义的时候可以用voidfunc(void);前面的表示函数无返回,括号里表示函数无参数。 或者void*可以表示无类型指针,允许被强制转化成任意类型指针。 17.枚举类型 所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。 适用于一个变量只有几种可能的值的情况。 枚举类型的一般形式为 enum枚举类型名{枚举常量表列}; 例如 enumweekday{sun,mon,tue,wed,thu,fri,sat}; 在声明了枚举类型之后,可以用它来定义变量。 如 weekdayworkday,week_end; 18.新类型名代替已有类型名(typedef) 还可以用typedef声明一个新的类型名来代替已有的类型名。 如 typedefintINTEGER;//指定用标识符INTEGER代表int类型 typedeffloatREAL;//指定用REAL代表float类型 声明一个新的类型名的举例: ①先按定义数组形式书写: intn[100]; ②将变量名n换成自己指定的类型名: intNUM[100]; ③在前面加上typedef,得到typedefintNUM[100]; ④用来定义变量: NUMn;(n是包含100个整型元素的数组)。 习惯上常把用typedef声明的类型名用大写字母表示,以便与系统提供的标准类型标识符相区别。 (1)typedef可以声明各种类型名,但不能用来定义变量。 用typedef可以声明数组类型、字符串类型,使用比较方便。 (2)用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。 基于对象的程序设计。 19.面向对象 应用背景: 在C++中,对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时的数据结构及对其的操作过程。 对于规模较大的程序,编程者可以采用面向对象的程序设计,使得复杂问题简单化。 在C++中,在一个系统中的多个对象之间通过一定的渠道相互联系,每个对象都是由数据和函数(操作代码)这两部分构成的。 如下所示 任何一个对象都应当具有这两个要素,即属性(attribute)和行为(behavior), 数据体现了前面提到的“属性”,如一个三角形对象,它的3个边长就是它的属性。 函数是用来对数据进行操作的,以便实现某些功能,例如可以通过边长计算出三角形的面积,并且输出三角形的边长和面积。 20.继承性 引论: “白马”继承了“马”的基本特征,又增加了新的特征(颜色),“马”是父类,或称为基类,“白马”是从“马”派生出来的,称为子类或派生类。 C++提供了继承机制,采用继承的方法可以很方便地利用一个已有的类建立一个新的类。 这就是常说的“软件重用”(softwarereusability)的思想。 21.多态性 在C++中,所谓多态性(polymorphism)是指: 由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应。 多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。 22.面向对象和面向过程的对比 面向对象程序设计面对的是一个个对象,一组操作调用一组数据。 把一个算法和一组数据结构封装在一个对象中。 对象=算法+数据结构 程序=(对象+对象+对象+…)+消息 消息的作用就是对对象的控制。 程序设计的关键是设计好每一个对象,及确定向这些对象发出的命令,使各对象完成相应操作。 传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。 所有的数据都是公用的,一个函数可以使用任何一组数据,而一组数据又能被多个函数所使用,如下图所示。 程序=算法+数据结构 23.类的概念 在C++中对象的类型称为类(class)。 类代表了某一批对象的共性和特征。 一个有一定规模的C++程序是由许多类所构成的。 前面已说明: 类是对象的抽象,而对象是类的具体实例(instance)。 在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中。 在C++中先声明一个类类型,然后用它去定义若干个同类型的对象。 对象就是类类型的一个变量。 声明一个类的过程如下所示 classStudent//以class开头 {intnum; charname[20]; charsex;//以上3行是数据成员 voiddisplay()//这是成员函数 {cout<<″num: ″< cout<<″name: ″< cout<<″sex: ″< } }; Studentstud1,stud2;//定义了两个Student类的对象stud1和stud2 归纳以上对类类型的声明,可得到其一般形式如下: class类名 {private: 私有的数据和成员函数; public: 公用的数据和成员函数; }; 补充说明: (1)private和public称为成员访问限定符(memberaccessspecifier)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 个人 笔记