下面是我复习过程中的一些笔记,比较凌乱。不过还是贴上来,算是自己学习的一个过程的记录吧
1、关于cout打印int整形数和char字符串的区别:
eg:int a = 25;
cout<<a<<endl;
在这里,我们要知道整数25和字符串“25”在存储上的区别,字符串”25”在程序的内部是分别存储’2’和‘5’这两个字符的编码(如ASCLL编码),所以cout只需要打印字符串中的各个字符即可,而整数25在程序的内部存储的是25这个数值的二进制数,不是单独的2和5。所以在打印之前,cout必须将整数形式的数字转换成字符串形式再打印。
在比较printf和cout之后,我们可以发现,cout的聪明程度比printf要高。在printf输出的时候,我们要指定输出的是什么类型,如%d表示输出整形。而cout就不需要这些了,因为它是对<<这个操作符重载了。是一种智能设计。同样cin也是这样的。
2、sizeof()操作的是字节数。
eg: sizeof(int) = sizeof(float) = 4;
int nArray[4] = {1,2,3,4};
sizeof nArray = 16; // sizeof()对数组是得到整个数组的大小
sizeof nArray[0] = sizoeof(int) = 4;
float var = 9.0;
char ch = 'w';
double dVar = 5.326;
double * pdVar = &dVar;
char * pch = &ch;
float * pfVar = &var;
cout<<var<<endl
<<&var<<endl
<<pfVar<<endl
<<pnVar<<endl
<<* pnVar<<endl
<<*pfVar<<endl
<<sizeof var<<endl // 4
<<sizeof ch<<endl // 1
<<sizeof dVar<<endl // 8
<<sizeof(string)<<endl // 32
<<sizeof(void*)<<endl// 4
<<sizeof pch<<endl // 4
<<sizeof pdVar<<endl // 4
<<sizeof nArray<<endl// 16,数组名就是数组的首地址,也是一个指针
<<sizeof pfVar<<endl // float*= 4 byte
<<sizeof pnVar<<endl // int * = 4 byte
<<sizeof var<<endl // float = 4 byte
<<sizeof(int)<<endl; // int = 4 byte
由上面可以得到一个结论,那就是指针内存大小为4byte(但用sizeof(arrayName)得到的是数组的总大小)
3、char是一种整形,char占一个字节的大小(8bit),也正是因为这样所以我们可以像整形数那样去对char进行操作,如加1。
4、特殊的初始化
对于数组的初始化,
① int nNum[4] = {1,2,3,4}; // okay
int nArray[4]; //okay
nArray[4] = {1,2,3,4}; // not allowed
nArray = nNum; // not allowed
② float fArray[5] = {1.5,2.3};//okay
如果只是对数组进行部分初始化,则数组是从左到右来匹配,并且数组自动将其他的元素设置为0。所以要将数组全部初始化为0很简单,只需要将数组的第一个元素初始化为0即可。eg:char cArray[200] = {0};
注:对于带参数列表的函数,必须从右向左添加默认值。也即要为某个参数设置默认值,则必须为它右边的所有参数提供默认值。
eg:int fun1(int n, int m = 4, int k = 7); // okay
int fun2(int n, int m = 4, int k ); // invalid
int fun3(int n = 2, int m = 9, int k = 6); // okay
5、 string
C++有两种处理字符串的方式,一种来自C语言,我们称为C-风格字符
(C-style string);另一种是基于string类库的字符串。
C-sytle string有一个性质就是:以空字符(null character)结尾,空字符被写
作/0,ASCII码为0,用来标记字符串的结尾。
eg: char cName[7] = { ‘L’,’e’,’e’,’z’,’h’,’m’,’/0’}; // 显式加入’/0’。
char cName[7] = “Leezhm”; // 隐式包含’/0’。
注意:字符常量和字符串常量的区别:
eg: char ch = ‘e’; // ascii = 83
char ch = “e”; // ‘e’’/0’ 所有这样是非法的,”e”是一个串
,返回字符串的字符个数,
注意不包括’/0’字符。
字符串的输入,面向行的输入:
① getline(),getline是通过回车键输入的换行符来确定输入结尾。
② get(),get有几种变体,其中有一种与getline工作方式一样。
eg:char ch[20];
cin.getline(ch, 20);
char name[20];
char address[50];
cin.get(name, 20);
cin.get(address, 50); // 这个时候会出现错误,因为get读到行尾时,它丢弃换行符,// 并将它留在输入队列中,所以在我们两次输入时,第二次
// 得到的第一个字符便是换行符。
修改方法为:cin.get(name, 20);
cin.get(); //利用这种不带参数可以读起下一个字符
cin.get(address, 50);
或: cin.get(name, 20).get();
cin.get(address, 50);
String class:
String类位于std名称空间中,它是标准的库(ISO/ANSI C++ 99)。我们可以将它当成一个基本的变量一样使用。String类的设计让程序能够自动处理string变量的大小。
eg:string str;
str = “hello!”;
str = “welcome”;
由上面可以知道string类的赋值、拼接和附加变得很容易。
关于string的copy、compare等具有见string class介绍。
String的输入:getline(cin, str);