每周100个C++知识点(备忘录)(一)

001-016 基础知识

1.C++可以使用printf()和scanf(),但是必须添加stdio.h头文件

2.//:开头为注释,也可以使用C风格注释,/XXXXXXX/,尽量用C++风格

3.int main():函数头,描述函数与调用它的函数之间的接口,这里是main和操作系统之间的接口

4.using namespace:编译指令

5.{函数体}:函数体

6.cout:标准输出语句

7.return:main()的结束语句,没有时默认为return 0

8.为什么要定义main()函数?因为main()函数是程序的起点,一般从main开始执行程序;DLL不是独立程序,不需要定义main函数

9.#include :#开头为预处理,io是输入输出,使用cin和cout必须添加这个,相当于iostream.h被放在这里了

10.头文件名:C++旧和C旧,都使用.h作为头文件命名后缀;C++新和转换C,使用cmath这样的命名,没有任何扩展名

11.using编译指令,说明使用函数的命名空间,以区分不同厂商提供的名称相同的函数。

12.<<:插入运算符,cout << 表示把后文信息传给cout(插入到输出流中)

13.endl:重起一行,等于\n,但endl保证程序继续运行前刷新输出

14.C++中的多功能输出,是printf()函数,类似于C#的format

15.cstdlib库中包含的rand()函数,不需要任何参数,返回随机值

16.函数需要在main()使用之前定义,最好的办法是在一开始进行声明,把函数体写在main()之后

017-046 基本变量

17.以__开头或_X开头的都是保留变量,用作全局标识符;区分大小写且第一个字符不能是数字

18.climits库提供了大量关于类型的保留字,比如INT_MAX之类,和sizeof的作用很像,sizeof()返回长度

19.初始化变量可以使用int a={xxx}也可以不给初值,默认为0,也可以不用“=”

20.cout<<提供了dec/hex/oct分别显示十/十六/八进制,使用时进行切换而无输出,用后也记得切换

21.字符使用单引号括起,字符串使用双引号括起

22.使用wchar_t来定义Unicode字符中超过8Bit的,这种类型的输出使用wcout

23.常量的表示方法有两种,一种是#define CL xxx,另一种是const type Cl/kcl=xxx,一般大写首字母或加k,在声明时就应该初始化

24.使用const可以声明数组、数组长度等,且作用域与define不同,一般使用const

25.cout.setf()成员函数修改输出时float与double的保存位数,一般默认为6位

26.C++对浮点数转换整数时,采取截取的方式,不四舍五入

27.强制类型转换格式有两个,(type)xxx和type(xxx)都可以用

28.static-cast (value)可以完成数值强制转换

29.auto类型可以视变量类型而定,和C#中var一样

30.数组的声明是typeName arrayName[arraySize],其中arraySize必须是编译时(运行前)已知的,可以使用new来避开这个限制

31.数组的索引是数组的位数-1

32.数组初始化的方法:①type name[n]={x1,x2,…};②type name[n];如果只对一部分初始化,则其他部分默认为0;③type name[]={x1,x2,…,xn};自动计算n的值

33.C++11的新风格,可以不写{}前的等号,但必须注意不能进行缩窄操作

34.C-风格字符串结尾都是’\0’,字符串的声明可以char name[]="";双引号的是字符串,单引号的是字符,用双引号括起的字符串隐式包含’\0’

35.strlen()函数返回字符串长度且不包含’\0’,需要头文件cstring

36.cin.getline(array,size)可以接受一行,以回车为结束;该函数使得用户Enter的换行符变成空字符,并且不保存换行符

37.cin.get(array,size)可以接受一行,以回车为结束,但函数后面保留换行符,因此第二个cin.get()读取的是换行符,之后才可以再进行读取,改进方式是cin.get(array,size).get(),因为cin.get(array,size)得到的也是一个cin对象,可以调用get()方法

38.注意在读取前一个内容后,用户输入的回车被当作换行符,如果用get()函数,则其被保留在了字符串中,需要再使用get()读取它

39.string包含在命名空间std中,且使用时需要头文件string。将字符串声明为string类,这是简单变量,而不是数组。也可使用C++11标准,string third_data= {“xxxxxx”},“=”可以去掉

40.不能将数组赋值给数组,但是可以将字符串赋值给字符串。string类允许不同的几个字符串相加,比如str=str1+str2;str+=str3

41.string用到的其他C风格字符串操作,需要添加cstring头文件,strcpy()和strcat()函数使用时不管数组原本大小,因此可能造成错误,使用strncat()和strncpy()可以指定参数以确保正确

42.获取char类型长度使用strlen(charr1);获取string类型长度使用str1.size()

43.char读取一行时使用cin.getline(array,size);string读取一行时使用getline(cin,name)

44.string对象不是C++一开始就定义了的标准对象,但使用友元函数进行处理

45.使用R"(xxxxxx)"可以直接显内容,不管转义字符等平时无法输出的内容

46.自定义定界符,R"+(标识原始字符串的开头时必须使用)+"

047-057 结构体、枚举、共用体

47.结构可以存储一系列信息,也可以有结构数组描述一类物体,定义为struct structName{char name[n];float parameter1;double parameter2;…}。在使用时可以直接structName name1,而传统C语言需要struct structName name1

48.结构体声明可以使用外部声明,也可以使用内部声明,一般为了让程序中所有函数都可以使用结构体,使用的是外部声明,声明应当在调用结构体的函数之前完成

49.可以把一个结构赋值给另一个相同类型的结构,且可以把结构作为参数传递给函数,也可以让函数的返回值为结构

50.结构的声明和初始化方式还可以是,声明结构后直接将变量名放在结构声明后;直接将变量名放在结构声明后并赋值

51.结构数组初始化时同时对多个结构进行初始化,调用时需要按:结构数组名[索引].内容进行调用

52.共用体和结构类似,但共用体同时只可能是一种类型,也就是说共用体是可变类型,当数据项使用两种或更多种格式时可以节省空间

53.共用体声明union name{type1 name1;type2 name2;…}namexx

54.匿名共用体不需要进行共用体变量名称声明,直接用即可,同时只能使用一种类型

55.枚举的定义为enum name{x1,x2,x3,…}。x1对应0,x2对应1,依此类推;不可以将int赋值给枚举类型,但枚举类型可以提升为int型。可以使用name(int)的强制类型转换完成赋值

56.为枚举赋值:可以任意赋值,但后一个如果没赋值,则默认比前一个大1;可以给多个枚举量赋相同的值,且可以赋long甚至long long类型的

57.作用域内枚举:作用域范围指的是上限/下限的下一个2的幂-1

058-077 指针、C风格字符串、动态数组

58.&是取地址符,获取某个变量的地址;而*(指针)是间接值符或解除引用符,用于获取某个地址对应的值

59.指针的声明:type * pionterName;也可以是type* Name,一般使用这个。但使用type* Name1,Name2声明时,第一个Name1变量被声明为指针变量,而第二个变量被声明为type变量

60.指针初始化时,被初始化的是指针本身,而不是指针的值。★★★★★使用指针时必须一定务必将指针初始化为一个确定的适当的地址!

61.虽然指针对应的地址是一个整型,但是不可以将整型数据赋值给一个指针,可以使用强势类型转换type* pt;pt=(type*) 数值来进行赋值

62.指针的最大作用是在程序运行时为动态分配内存,为一个数据对象指定分配内存,格式为typeName * pointer_name =new typeName;关键与直接赋值给指针的不同是new运算符

63.使用New分配的内存与常规变量声明分配的内存存储在不同区域,new分配的内存在堆heap或自由存储区种,而常规变量声明分配的内存在栈stack中

64.使用delete删除已经分配的内存,★★★★但是不要重复释放内存,同时尽量确保New和Delete配对使用。不可以用delete释放指向常规变量的指针,但可以释放0指针

65.一般不要创建两个指向同一内存块的指针,因为可能会错误删除。但对于返回指针的函数可能不同??????????

66.静态数组在编译前就分配了空间,叫做静态联编;动态数组的分配内存方式是动态联编

67.动态数组的创建方式是int * pt = new int [n];且在delete时,应当使用delete [] pt的方式,即new和delete需要对应[]。创建的动态数组返回的是第一个数组元素的指针的地址

68.创建的动态数组的访问,可以直接使用数组名[x]的方式,因为数组和指针是“等价”的;在对数组名做加减法时,实际操作的是指针加减法,+1意味向后取,-1向前取;而delete时必须只能释放原来的第一个数组地址

69.指针算数,+1意味着+类型字节数,C++将数组名解释为地址;不可以数组名运算,但可以指针名运算

70.在cout和C++大多数字符串运算过程中,把字符串看成第一个字符的地址

71.字符串字面值是常量,因此声明时可以用const修饰。字符串读入程序时,应当使用已分配的内存地址;cout字符指针时,如果直接输出,则显示的是字符串,必须进行(int *)的强制类型转换,才会输出正常指针地址

72.给字符串数组赋值,使用strcpy或者strncpy以及strcpy_s进行,而不能直接进行“=”赋值,这样做的结果是复制地址,即两个变量指向同一个地址

73.可以使用new来初始化一个结构,使用new初始化的结构有两种访问方式:(*name).member或name->member

74.C++管理内存:①自动存储,看作局部变量,一般的常规变量自动分配存储空间,作用域是代码块,存储在栈中后入先出(LIFO);②静态存储,使用static关键字进行声明;③动态存储,将数据存储在堆内,或自由存储空间内,堆在内存中的存储数据不连续

75.类型组合,可以创建结构体、结构体数组、结构体指针、结构体指针数组、指向结构体指针数组的指针(需要用const进行声明)

76.在使用指针时务必注意,*pn->member(错)与(*pn)->member是完全不同的,前者企图获取pn.member的地址,但它并不是一个指针

77.可以使用vector和array类来代替数组。使用哪个类都要加#include 或#include ,但是vector支持动态创建,而array只支持静态创建

078-100 循环及cin初探

78.for循环的结构是:for (initialization;test-expression;update-expression);for循环(和其他循环一样)类似函数,区分的方法是,for后跟一个空格,而函数后的括号直接写,不用空格

79.C++允许“语句声明表达式“,也就是在for循环的初始化部分进行语句声明操作,这样作用域只有for循环

80.更新表达式可以是任何形式的表达式,只要有效就可

81.++a或–a:先对a进行运算,再拿来做进一步判断;a++或a–:先进行判断,再来进行运算。前缀是先进行计算,而后缀需要复制一个副本先,因此前缀运算的效率高于后缀运算

82.后缀运算的优先级比前缀运算以及解除引用运算的优先级高。前缀运算符从右到左进行运算:++pt意味着先pt取pt的值,再将值+1,同时向后移动一位★★★;但++(*pt)或(*pt)++就不会改动指针

83.for语句后面跟一条语句,因此如果需要跟的是一个语句块,需要打花括号

84.语句块儿中可以定义内部变量,内部变量的作用域是整个语句块。定义与某一外部变量同名的内部变量,则内部变量在作用域内有效,离开作用域外部变量仍有效

85.在循环外部定义temp会比在循环内部定义temp效率高

86.逗号表达式允许两个表达式连接,但是逗号表达式的值被赋予最后一个逗号后的值

87.C++将字符串视作C-风格的,也就是说word=="mute"是看两个字符串的地址是否相同。而比较两个字符串用strcmp(str1,str2)返回负数,说明str1比str2的ASCII靠前;返回正数,说明靠后。两个字符串即使数组大小不同,也可能是相同的(因为C-风格字符串结尾是\0)

88.可以比较字符,即char charr1==‘z’,本质是比较ASCII码或Unicode码的值

89.如果是string风格的字符串,则可以直接进行比较;原因是string进行了运算符重载

90.while循环本质和for循环一致,几乎等效。但一般无法预知循环次数时,选择while循环;需要进行计数时,使用for循环

91.调用系统时间,使用ctime库,该库定义了clock()函数和clock_t类型。定义了CLOCKS_PER_SEC符号常量,用系统时间除以它等于秒数,用秒数乘以它等于系统时间。这么做的目的是,以前计时时,通常采用while空循环的方法,但是所花时间不同,依赖于硬件

92.类型别名:有两种定义方式,①#define replaced_name original_type_name;②typedef typeName aliasName;在声明一系列变量时,必须用第二种方法,原因是,假设#define FLOAT_POINTER float * FLOAT_POINTER pa,pb;则预处理时会变成:float * pa,pb;发现pb没有被声明为指针

93.typedef不是声明新的类型,而是给原有类型一个别名

94.一般使用do while循环,第一步要和用户进行交互,或是否满足某个条件

95.C++11提供了基于范围的for循环,这将在后续章节进行讨论

96.原始的cin,不接收空格和换行符,输入的内容中的空格、换行符不被显示,也不包括在计数内,且cin的输入会被缓冲,直到遇见回车才会进行下一步处理。解决方法是使用cin.get(char);这个函数也是在istream类中定义的,但仍被缓冲,char可以作为参数直接被函数调用的原因是,cin.get(ch)的参数声明为引用类型

97.C++的函数支持函数重载的OOP特性,而C不支持;函数会以不同的方式处理

98.二维数组和一维数组的声明方式类似,type name[m][n];初始化时用多个{}(每个代表一行元素)进行初始化,内部还是用逗号隔开

99.进行访问或其他操作时,可以直接按矩阵进行索引。一般可以将字符数组设置成char指针数组

100.对于字符串数组,也可以使用下面两种方法:①char name[m][size];②const string name[size];使用指针数组的效率更高,但要修改其中任何一个字符,①是不错的选择;直接更改name[x],则②的声明更方便一些
总结:for循环是入口条件循环;while循环是入口条件循环;do while循环是出口条件循环

预告

因为一些原因,从头开始C++,下期更新:选择、分支结构、函数、函数深入。

预计碎碎念的备忘录有800条左右,后续会再更新PCL的内容,以及逐步补上Python的内容(原谅考研弃更hhh)

备忘录的使用方法,看你大概需要哪一块儿的知识,在目录里找就好,分的已经比较细了!

重点会在:函数、类、数据流、一些常用库,C++11新特性等方面

发布了7 篇原创文章 · 获赞 2 · 访问量 642

猜你喜欢

转载自blog.csdn.net/qq_41450779/article/details/103942189
今日推荐