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);
}
效果如下:


浙公网安备 33010602011771号