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);
}

 效果如下:

posted @ 2012-02-06 11:54  Kingdom_0  阅读(214)  评论(0编辑  收藏  举报