吐血共享 C++Primer中文版第4版学习笔记15242页总计Word文件下载.docx
- 文档编号:4881229
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:56
- 大小:7.60MB
吐血共享 C++Primer中文版第4版学习笔记15242页总计Word文件下载.docx
《吐血共享 C++Primer中文版第4版学习笔记15242页总计Word文件下载.docx》由会员分享,可在线阅读,更多相关《吐血共享 C++Primer中文版第4版学习笔记15242页总计Word文件下载.docx(56页珍藏版)》请在冰点文库上搜索。
max_act_task_number)
(n7stat_stat_item_valid(stat_item)))
for(i=0,j=0;
(i<
BufferKeyword[word_index].word_length)
(j<
NewKeyword.word_length);
i++,j++)
first_word_length)&
second_word_length);
.../*programcode*/
函数参数:
n7stat_str_compare((BYTE*)&
stat_object,
(BYTE*)&
(act_task_table[taskno].stat_object),
sizeof(_STAT_OBJECT));
n7stat_flash_act_duration(stat_item,frame_id*STAT_TASK_CHECK_NUMBER
+index,stat_object);
一行代码只允许有一个语句。
错误风格:
rect.length=0;
rect.width=0;
正确风格:
rect.width=0;
if、for、do、while、case、switch、default等关键字需要采用单行语句来方便阅读。
1.1.1.1要求描述
if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。
1.1.1.2示例
if(pUserCR==NULL)
return;
程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。
在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
for(...)
if(...)
voidexample_fun(void)
语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。
给操作符留空格时不要连续留两个以上空格。
在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;
进行非对等操作时,如果是关系密切的立即操作符(如->
),后不应加空格。
(1)逗号、分号只在后面加空格。
inta,b,c;
(2)比较操作符,赋值操作符"
="
、"
+="
,算术操作符"
+"
、"
%"
,逻辑操作符"
"
,位域操作符"
<
^"
等双目操作符的前后加空格。
if(current_time>
=MAX_TIME_VALUE)
a=b+c;
a*=2;
a=b^2;
(3)"
!
~"
++"
--"
(地址运算符)等单目操作符前后不加空格。
*p='
a'
;
/*内容操作"
*"
与内容之间*/
flag=!
isEmpty;
/*非操作"
p=&
mem;
/*地址操作"
与内容之间*/
i++;
/*"
"
(4)"
->
."
前后不加空格。
p->
id=pid;
指针前后不加空格*/
(5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。
if(a>
=b&
c>
d)
只使用/**/注释关键字,不得使用//注释关键字,且/**/注释中不得嵌套/**/注释。
源程序有效注释量必须在20%以上,且不宜超过50%。
为美观注释上要有空行。
将注释与其上面的代码用空行隔开。
一个函数仅完成一件功能。
使用常量代替数字
#defineTRUNK_IDLE0
#defineTRUNK_BUSY1
if(Trunk[index].trunk_state==TRUNK_IDLE)
Trunk[index].trunk_state=TRUNK_BUSY;
...//programcode
全局变量通常是万恶之源,如非确实必要禁止使用全局变量。
每个变量都需要进行初始化特别是指针变量。
正文开始
第一章快速入门
C++中必须有一个命名为main的函数(返回值类型必须是int型),操作系统通过main函数的返回值来确定程序是否执行成功。
GUN编译器的默认命令是g++如:
g++prog1.cc–oprog1
endl是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer),通过刷新缓存区,用户可以立即看到写入到流中的输出。
std:
:
cout:
为作用域操作符,表示使用的是定义在命名空间std中的cout。
如果不能保证读取变量之前重置变量,就应该初始化变量。
C++注释采用/**/,注释不能嵌套。
While语句,for语句,if语句
标准库的头文件用尖括号<
>
括起来,非标准库的头文件用双引号””括起来。
成员函数是由类定义的函数,有时候称为类方法。
当调用成员函数时,通常指定函数要操作的对象,语法是使用点操作符(.)。
编译能查出的普遍错误:
语法错误,类型错误,声明错误。
第二章变量和基本类型
C++算术类型:
boolcharwchar_tshortintlongfloatdoublelongdouble
两个相邻的仅由空格,制表符,或换行符分开的字符串字面值可连接成一个新的字符串。
初始化:
C++支持两种初始化变量的形式:
复制初始化(=)和直接初始化(()),直接初始化效率更高。
如:
Intival(1024);
intival=1024;
初始化不是赋值,初始化指创建变量并给它赋初始值,而赋值是擦除对象的当前值并用新的值代替。
String定义在std命名空间中。
定义如何进行初始化的成员函数称为构造函数。
String类定义了几个构造函数,所以我们可以使用不同的方式初始化对象,如:
#include<
iostream>
/*必须包含头文件*/
string>
usingnamespacestd;
intmain()
stringstr1="
C++Primer,4thEd."
stringstr2("
Helloworld!
);
stringstr3(10,'
5'
//str3="
5555555555"
cout<
str1<
endl;
str2<
endl;
str3<
return0;
声明用于想程序表明变量的类型和名字,可以用extern关键字声明变量名而不定义它,extern声明不是定义,也不是分配存储空间,程序中变量可以多次声明,但只能定义一次。
只有定义才分配存储空间,如果声明也有初始化式,那么它被当做是定义,即使有extern关键字,如:
externdoublepi=3.1416;
可以使用const关键字定义一个不能修改的常量,定义时就必须初始化。
在全局作用域声明的const变量是定义该对象的文件的局部变量,此变量只存在于那个文件中们不能被其他文件访问;
通过指定const变量为extern,就可以在整个程序中访问const对象(非const变量默认为extern)。
引用就是它绑定的对象的另一个名字,作用在引用上的所有操作都是作用在该引用绑定的对象上,通过在变量名前添加“&
”符号来定义,不能定义引用类型的引用,但是可以定义任何其他类型的引用,引用必须用与该引用同类型的对象初始化。
Intival=1024;
int&
refVal=ival;
//正确int&
refVal2;
//错误,必须指定引用对象int&
refVal3=10;
//错误,引用的必须是对象
refVal+=2;
//将refVal指向的对象ival加2
intii=refVal;
//将refVal所指向对象的值赋给int对象ii
const引用指向const对象的引用,此时可以读取const对象的值,但是不能修改。
constintival=1024;
constint&
refval1=ival;
//错误
Typedef可以用来定义类型的同义词:
typedefdoublewanges;
此时wanges
枚举使用关键字enum定义,其后是一个可选的枚举类型名,和一个用花括号括起来,用逗号分开的枚举成员列表,如:
eunmopen_modes{input,output,append};
input默认为0,后面的比前面的值大一。
枚举成员是常量。
C++支持class和struct(从c语言继承而来)定义类类型。
默认情况下,struct的成员为public,而class的成员为private。
头文件用于声明而不是用于定义。
避免多重包含同义头文件:
#define指示接受一个名字并定义该名字为预处理器变量,#ifndef指示检查指定的预处理变量是否未定义,,如果预处理器变量未定义,那么跟在其后的所有指示都被处理,知道出现#endif。
第三章标准库类型
使用getline读取整行文本,getline函数返回时丢弃换行符,换行符将不会存储在string对象中。
String操作:
s.empty()s.zize()s[n]—返回s中位置为n的字符,从0开始s1+s2
s1=s2s1==s2!
=<
<
=>
>
=
size操作返回的是string:
不要把size的返回值赋给一个int变量。
当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。
下标操作:
strings1;
cin>
s1;
for(string:
size_typeix=0;
ix!
=s1.size();
++ix)
{
cout<
s1[ix]<
}
String对象中字符的处理:
在cctype头文件定义了各种字符操作函数,适用于string对象的字符(或其他任何char值)。
其操作函数见截图--------1cctype定义的函数.png
tolower()toupper()
vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。
将vector称为容器是因为它可以包含其他对象,容器中的所有对象都必须是同一种类型的。
使用vector的声明:
vector>
usingstd:
vector;
vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型,vector类型的每一种都指定了其保存元素的类型。
几种初始化vector对象的方式:
见截图2初始化vector对象的方式.png
Vector<
t>
v1;
vector<
v2(v1);
v3(n,i);
v4(n);
Vector对象的操作:
见截图3vector操作.png:
v.empty()v.size()v.push_back(t)v[n]v1=v2v1==v2!
=,<
<
=,>
>
=。
Vector下标操作不添加元素,下标只能获取也存在的元素。
sevc;
for(vector<
=5;
{sevc[ix]=ix;
sevc[ix];
正确操作是:
{sevc.push_back(ix);
除了使用下标访问vector对象的元素外,标准库中还提供了使用迭代器的方法访问元素,迭代器是一种检查容器内元素并遍历元素的数据类型。
容器的iterator类型(每种容器都定义了自己的迭代器类型。
iteratoritor;
)
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器,如果容器中有元素的话,由begin返回的迭代器指向第一个元素:
iteratoriter=ivec.begin();
假如vector不空,则初始化后iter即指该元素为ivec[0]。
由end()操作返回的迭代器并不指向vector中任何实际的元素,它指向“末端元素的下一个”,它只是起一个哨兵的作用。
迭代器类型可以使用解引用操作符(*)来访问迭代器所指向的元素。
迭代器使用自增操作符向前移动迭代器指向容器的下一个元素。
End()操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
用!
=或==操作符来比较两个迭代器,如果两个迭代器对象指向同一个元素,则它们相等。
=sevc.size();
sevc[ix]=1;
sevc[ix]<
用迭代器实现为:
iteratoriter=sevc.begin();
iter!
=sevc.end();
++iter)
*iter=1;
*iter<
使用vector:
iteror能改变vector中的值,每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,不能修改。
for(vector<
const_iteratoriter=sevc.begin();
//错误,不能修改
不要混淆const_iterator和const型的iterator对象。
Constvector<
iteratorite=sevc.begin();
*ite=1;
//正确
++ite;
迭代器支持算术操作iter+niter–n
iteratormid=vi.begin()+vi.size()/2;
//定位于vector的中间元素,效率更高
标准库bitset类型:
处理二进制位的有序集,每个位可能包含0(开)或1(关)值。
bitset>
Usingstd:
bitset;
定义bitset时,要明确bitset含有多少位,须在尖括号里给出它的长度值,长度值必须定义为整型字面值常量或也用常量值初始化的整型const对象。
bitset<
32>
bitvec;
//32bit,allzero
初始化bitset对象的方法:
见截图4初始化bitset对象的方法.png
n>
b;
bitset<
b(u);
b(s);
b(s,pos,n);
当用string对象初始化bitset对象时,string对象和bitset对象之间是反向转化的:
stringstrval(“1100”);
bitvec4(strval);
//结果bitvec4的位模式中第二和第三的位置是1,其余位置是0,如果string对象的字符数小于bitset类型的长度,则高阶位将置为0。
Bitset操作见截图:
5bitset操作.png
访问bitset对象中的位也可以使用下标操作。
数组与vector类型比较:
数组的长度是固定的,数组创建之后就不能添加新的元素,指针则想迭代器一样用于遍历和检查数组中的元素。
现代c++程序应尽量使用vector和迭代器类型,设计良好的程序只有在强调速度的时候才在类实现的内部使用数组和指针。
数组长度固定,数组没有获取其大小的size操作。
也不能添加元素。
如果需要更改数组的大小,只能创建一个更大的新数组,然后把原来的数组的所有元素复制到新的数组空间中。
非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
初始化数组:
Constunsignedarray_size=3;
Intia[array_size]={0,1};
//维数大于列出的元素个数,剩下的为默认值0
Intia[]={1,3,5};
//显示初始化的数组也可以指定数组的维数
Constcharca3[5]=“hello”;
//错误,使用一组字符字面值初始化字符数组时,要记得添加结束字符串的空字符,hellois7elements
一个数组不能使用另一个数组初始化,也不能将一个数组赋值给另一个数组。
通过用for循环,可以实现把一个数组复制给另一个数组。
intia[]={1,2,3};
intia2[](ia);
//错误constunsignedarray_size=3;
intia3[array_size];
ia3=ia;
数组元素也可以用下标操作符来访问,数组元素下标是从0开始的,数组下标类型是size_t。
constsize_tarray_size=10;
intia[array_size];
for(size_tix=0;
=array_size;
ia[ix]=ix;
ia[ix]<
数组的遍历可以使用下标或者指针实现。
对指针进行解引用操作时,可获得该指针所指对象的值,指针做自增操作时,则移动指针使其指向数组中的下一个元素。
指针保存的是另一个对象的地址。
strings(“helloworld”);
string*sp=&
s;
//定义一个指向string类型的指针sp并初始化为指向string类型的对象s。
避免定义一个未初始化的指针,如果必须先定义指针,则将其初始化为0(初始化为null和0一样)。
C++提供了一种特殊类型的指针类型void*,它可以保存任何类型对象的地址。
(*)解引用操作将获取指针所指向的对象:
strings(“hello”);
*sp;
//printhello*sp=“goodbye”;
//contentsofsnowchangedstrings2=“some”;
sp=&
s2;
//spnowpointstos2
引用和指针的区别:
引用和指针都能间接地指向一个值,但是引用总是指向某个对象,定义引用时没有初始化是错误的,其次,给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。
引用一经初始化,就始终指向同一个特定的对象。
intival=1024,iva2=2048;
int*pi=&
ival,*pi2=&
iva2;
pi=pi2;
//pinowpointstoival2
int&
ri=iva1,&
ri2=ival2;
ri=r2;
//此时iva1和iva2的值相等,都为iva2,但是引用不改变。
指向指针的指针:
int*pi=&
iva1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 吐血共享 C+Primer中文版第4版学习笔记 15242页总计 吐血 共享 Primer 中文版 学习 笔记 15242 总计
![提示](https://static.bingdoc.com/images/bang_tan.gif)