C++ Primer Plus 二
1.使用new和delete时,应遵守以下规则:
* 不要是用delete来释放不是new分配的内存。
* 不要是用delete释放同一个内存块两次。
* 如果是用new[]为数组分配内存,则应使用delete来释放。
* 如果使用new[]为一个实体分配内存,则应使用delete(没有方括号)来释放。
* 对空值指针应用delete是安全的。
2.一般来说,如果给count提供一个指针,它将打印地址。但如果指针的类型为char *,则cout将显示指向的字符串。如果要限制的是字符串的地址,则必须将这种指针强制转换为另一种指针类型,如int *。
char *animal="dog";
cout<<animal<<"--"<<*animal<<endl;// dog--d
3.经常需要将字符串放到数组中,初始化数组时,请使用=操作符;否则应使用strcpy()或strncpy().
4.在指定结构成员时,有些人搞不清楚合适应使用句点操作符,合适应使用箭头操作符。规则非常简单。如果结构标示符是结构名,则使用句点操作符;如果标示符是指向结构的指针,则使用箭头操作符。另一种访问结构成员的方法是,如果ps是指向结构的指针,则*ps就是被指向的值--结构本身。由于*ps是一个结构,因此(*ps).price是该结构的price成员。C++的操作符优先规则要求使用括号。
5.自动存储和静态存储的关键在于:这些方法严格的显示了变量的寿命。变量可能存在于程序的整个生命周期(静态变量),也可能只是在特定函数被执行时存在(自动变量)。
6.数组、结构和指针式C++的3种复合类型。数组可以在一个数据对象中存储多个同种类型的值。通过使用索引或下标,可以访问数组中的各个元素;结构可以将多个不同类型的值存储在同一个数据对象中,可以使用成员关系操作符(.)来访问其中的成员。使用结构的第一步是创建结构模板,它定义结构存储了那些成员。磨边的名称将成为新类型的标示符,然后即可以声明这种类型的结构变量;共用体可以存储一个值,但是这个值可以是不同的类型,成员名指出了使用的模式。
7.C++为类型建立别名的两种方式
1.#define BYTE char;//preprocessor replaces BYTE with char
2.typeof char byte;//makes byte an alias for char
8.cctype中的字符函数
isalnum() 如果参数是字母数字,即字母或数字,该函数返回true
isalpha() 如果参数是字母,该函数返回true
isblank() 如果参数是空格或水平制表符,该函数返回true
iscntrl() 如果参数是控制字符,该函数返回true
isdigit() 如果参数是数字(0-9),该函数返回true
isgraph() 如果参数是除空格以外的打印字符,该函数返回true
islower() 如果参数是小写字母,该函数返回true
isprint() 如果参数是打印字符(包括空格),该函数返回true
ispunct() 如果参数是标点符号,该函数返回true
isspace() 如果参数是标准空白字符,如空格,进制,换行符,回车,水平制表符或垂直制表符,该函数返回true
isupper() 如果参数是大写字母,该函数返回true
isxdigit() 如果参数是十六进制的数字,即0-9,a-f或A-F,该函数返回true
tolower() 如果参数是大写字符,则返回其小写,否则返回该参数
toupper() 如果参数是小写字符,则返回其大写,否则返回该参数
9.关于删除错误输入:
while(!(cin>>golf[i]))
{
cin.clear();//如果省略该条语句,程序将拒绝继续读取输入。
while(cin.get()!='\n')
continue;
cout<<"Please enter";
}
10.
arr[i]=*(arr+i)// values in two notations
&arr[i]=arr+i// addresses in two notations
int sage=80;
const int * ps=&sage;//A.
int * const finger=&sage;//B.
B.语句中,关键字const的位置与以前不同。这种声明格式使得finger只能指向sloth,但允许使用finger来修改sage的值。A.语句中,不允许使用ps来修改sage的值,但允许将ps指向另一个位置。简言之,finger和*ps都是const,而*finger和ps不是
11.关于递归调用。
递归的方法中,可以多次调用自己,来实现不同的需求。
const int Len=66; const int Divs=6; void subdivide(char ar[],int low,int high,int level); int main() { char ruler[Len]; int i; //初始化ruler,全部设置为 ' '. for(i=0;i<Len-2;i++) ruler[i]=' '; ruler[Len-1]='\0'; int max=Len-2; int min=0; ruler[min]=ruler[max]='|'; //cout<<ruler<<endl; for(i=0;i<Divs;i++) { subdivide(ruler,min,max,i); cout<<ruler<<endl; //for(int j=1;j<Len-2;j++) // ruler[j]=' '; } cin.get(); return 0; } void subdivide(char ar[],int low,int high,int level) { if(level==0) return; int mid=(high+low)/2; ar[mid]='|'; subdivide(ar,low,mid,level-1); subdivide(ar,mid,high,level-1); }
效果如下: