CPP_Basic_Summary_0.4

版权声明:本文虽为 贴墙上的咖啡 原创,未经允许仍可转载. https://blog.csdn.net/enochhugh/article/details/66487762

##CPP_Basic_Summary_0.4

1、编译器不会检查数组下标是否有效
2、sizeof用于数组名,则计算整个数组中的字节数,用于单个元素才会得到元素长度
3、数组未初始化前其元素值不确定,且定义后不可初始化,也不能数组间互相赋值;而string对象未初始化时长度为0。
4、如果只对数组的一部分初始化,如int shuzu[5] {0},则其余元素均被初始化为0
5、如果数组[]为空,则编译器将自动计算个数,应该视实际需要使用
6、初始化数组时可以省略=,直接{}
7、列表初始化禁止数据类型的缩窄转换
8、’\n’空字符一般被char字符数组视为字符串的结尾,空格、回车、换行符等
9、应该提前考虑防止数组长度溢出,C++对字符串长度没有限制
10、设计最短数组的时候,使用strlen()+1,因为不能忽视字符串结尾的’\0’,它还可用于截断字符串数组
11、注意单引号和双引号的区别,"“和’’,一个是字符串,一个是字符常量
12、一个cout后面的多个“”会自动拼接,进而合成同一个字符串输出,且之间不会添加空格
13、建议使用符号常量来初始化数组,则以后更改的时候更为方便
14、对于数组name,可使用面向行的输入cin.getline(name,20);则最多读入19个字符,这种方式以换行符来确定行尾,但不保存换行符;而在存储字符串时,它用空字符替换换行符。也就是说,将enter键替换为”\0"
15、对于数组name,也可使用cin.get(name,20)来读取,但是会将换行符留在输入队列,使得下一次读取时候直接读取换行符导致以为到达字符串结尾而读取失败。故而推荐使用改进的方式,解决此问题的同时对过程的控制更准确:cin.get(name,20).get()
16、类似的,cin.getline(name1,20).getline(name2,20)相当于两次调用getline
17、如果使用的是cin.get(),则是仅仅读取一个字符,如果输入空行导致失效位被设置,使用cin.clear()解除即可;而getline()遇到字符串输入比分配数组长的时候也会设置失效位,并关闭后面的输入,同理即可解决。方式:必须首先重置cin以接受新的输入,其次删除错误的输入,最后再提示用户重新输入:

while (!(cin>>golf[i]))
{
	cin.clear();
	while (cin.get()!='\n')
		continue;//删除所有错误输入直到行尾
	cout<<"Please enter again.";
}

18、string类的本质依然是数组,而且string可自动调节字符串大小,且可列表初始化
19、string类可直接±各字符串,实现直接赋值和拼接
20、如果包含了#include <cstring>头文件,可以使用strcpy(charr1,charr2)复制第二个字符串到第一个字符串,还可使用strcat(charr1,charr2)来将第二个字符串添加到第一个字符串结尾
21、C++11可使用如str1.size()来获取str1的长度,老式则使用strlen(str1)获取,此处不包括空字符
22、数组式的读取:cin.getline(charr,20);而string对象的读取:getline(cin,str1);
23、C++新增R"()"原始字符串,可以所见即所得,且"和(之间可加入如+这类来自定义需要的定界符
24、变量应限制于内部,但结构推荐使用外部声明,而且符号常量也适合外部声明
25、结构的初始化也可以使用列表初始化,如Fishx duck {“Tux”,0.12,120};
26、结构的定义和初始化可以同时进行,但是推荐分开执行,结构的位字段用于低级编程
27、结构数组是以结构为元素的数组,如Fishx gifts[100];指针数组是以指针为元素的数组
28、共用体,每次只能使用一种格式,重新赋值后原始数据及其类型丢失,多用于节省内存
29、enum为枚举类型,如enum bits{Yes=1,No=0};可以显式赋值也可以默认0、1、2……
30、枚举可以成员单独±数字,但是不可以互相加和,其中可以使用强制类型转换
31、枚举的范围:上限:大于最大值的最小的2的幂-1;下限:若大于等于0,为0,否则为小于最小值的最大的2的幂+1,并添负号。如最大枚举值101的上限为127,最小枚举值-6的下限为-7
32、使用指针时务必将其初始化为一个确定且适当的地址,如果要直接地址赋值,应该注意类型的问题,应使用如int
pt;pt=(int*)0xB80000000;
33、new分配的内存位于自由存储区,也称为“堆”,且必须使用delete释放且只能释放new出的内存块;不释放new出的内存或者释放了不是new出的内存都将造成错误
34、对于返回指针的函数,使用另一个指针更恰当,delete 空指针是安全的
35、动态数组:int* psome=new int[10]即可,释放用delete [] psome,psome指向数组第一个元素,可用psome[0]
36、数组名实质为一个指针,指向数组第一个元素的地址,但具体用法也有不同之处,如对数组使用sizeof()得到的是数组长度,而对指针使用则会返回指针的长度;另外,对数组名取地址会得到整个数组的地址,尽管数组名指向第一个元素地址
37、注意,如*(stack+1)和stack[1]是等价的,而且C++内部使用数组时会进行这样的转换
38、short tell[10];short (pas) [20]=&tell;所以pas实际上是一个指向数组的指针,且()至关重要
39、指针+1等于在数组中指向元素的位置右移,-1就是左移,而当两个指针指向同一个数组的时候,作差的结果是个整数,即两个元素的间隔
40、C++中用引号括起的字符串和数组名一样,也是第一个元素的地址,C++不发送字符串,只发送字符串的地址
41、使用const定义在指针前时(如const char
bird=“wren”),可以允许指针访问,但是不允许指针改变地址内的字符串
42、默认情况下cout<<一个指针将会打印地址,但是如果加了类似(char或int,取决于指针类型)将会打印指向的字符串
43、new动态结构时,指针ps使用->访问结构成员,而*ps使用.来访问结构成员,并务必注意别忘记使用delete

inflatable * ps=new inflatable;//动态结构指针
cin.get(ps->name,20);//指针法读取输入
cin>>(*ps).volume;//数组名引用法读取输入
cin>>ps->price;

44、可以使用以下语句设置恰当的内存:

char tmp[80];
cout<<"Enter  last name";
cin>>tmp;
char* pn=new char[strlen(tmp)+1];
strcpy(pn,tmp);
return pn;

45、C++使用自动存储(局部变量,使用栈,后进先出);静态存储(函数外定义或者使用static,存在于整个程序周期);动态存储(灵活,使用堆,可在A函数创建,B函数释放)。在栈中,内存的占用是连续的,而在堆中,new和delete的使用导致内存不连续,使得跟踪新分配的内存更加困难
46、注意各种类型的组合(完整代码参考P4.23)

antarctica_years_end s01, s02, s03;//三个结构变量
s01.year = 1998;//结构式赋值
antarctica_years_end *pa = &s02;//结构指针pa
pa->year = 1999;//指针式赋值
antarctica_years_end trio[3];//创建含三元素结构数组
trio[0].year = 2003;//结构数组访问成员
std::cout << trio->year << std::endl;
//输出结构数组第一个元素结构的year成员 2003
const antarctica_years_end *arp[3] = {&s01, &s02, &s03};//定义含3指针的指针数组
std::cout << arp[1]->year << std::endl;
//第二个元素,即&s02指向结构变量的year成员1999
const antarctica_years_end **ppa = arp;
//创建指向上一个指针数组的的指针
auto ppb=arp;
//或者使用const antarctica_years_end **ppb=arp
//ppa解除引用后,元素依为指针(毕竟为指针数组第一个元素)1998
std::cout<<(*(ppb+1))->year<<std::endl;
//ppb和ppa一样,故+1后指针右移一个元素为&s02,1999

47、const antarctica_years_end** ppb=arp;这类在C++11中可以使用auto ppb=arp;
48、模板类vector:new动态数组的替代品,存储于堆中,首先需要包含头文件#include <vector>,其次位于名称空间std中,最后是语法不同:vector xv(5)包含五个元素
49、模板类array:长度固定数组的替代,更方便强大安全但是效率稍低,也使用栈静态分配内存,需要包含头文件#include <array>,需要名称空间,最后是语法不同:array<double,10> xv={0}包含十个元素,需要注意的是这里的元素数和vector不同,不能是变量。和数组不同之处:可以互相直接赋值
50、数组的不安全性在于可将信息存储到数组外部,比如a2[-2]=2.5;而vector和array的成员函数at()可以更准确控制,安全取决于自己写的代码:a2.at(1)=2.3将2.3赋给a2[1]

猜你喜欢

转载自blog.csdn.net/enochhugh/article/details/66487762
cpp