C++学习备忘(二)
1.c++中的类型转换static_cast、dynamic_cast、reinterpret_cast、和const_cast,详见:
http://wenku.baidu.com/view/a9356b80d4d8d15abe234e32.html
2.指针的指针使用例如:
Item **itemList = NULL;
itemList = new Item*[n]//初始化一个长度为n的Item*类型的空间,要求Item有默认构造函数
for(int i=0;i<n;i++) itemList[i] = new Item();// 初始化每一个指针
//释放过程
for(int i=0;i<n;i++) delete itemList[i];//逐个释放
Delete itemList ; //释放itemList
3.一个函数有多个值要返回时,可用指针或引用将参数传入在函数内修改,如:
void GetGirdLocation( int x,int y,int &i,int &j )
{
i = y/10;
j = x/10;
}
或
void GetGirdLocation( int x,int y,int *i,int *j )
{
(*i) = y/10;
(*j) = x/10;
}
4.VS2008 快捷键 http://www.cnblogs.com/9999/archive/2009/09/24/1573030.html
(Ctrl +k+f 整理格式)
5.按位取反“~”逻辑取反“!”
6.运算符顺序:++i执行语句前执行,--i执行语句后执行,语句中()的级别最高,指针高于算数逻辑运算,取反“!”高于其他二元运算,算数运算高于逻辑二元运算,比较运算高于&&和||,例如:
1+2==3&&!item->IsOk()&&!item->Age()>0
等同于
((1+2)==3)&&(!(item->IsOk()))&&((!(item->Age()))>0)
参见:http://www.slyar.com/blog/c-operator-priority.html
7.void GetMemory(char *p,size_t num)
{
p = (char *)malloc(num);
//p只是str的值,是指向str对应内存的另一个指针,对p的修改并不影响str本身
//但是可以通过p指向的内容影响到str影响到的内容
// 如果str有值,p[i]='x'会影响到str的值
}
int _tmain(int argc, _TCHAR* argv[])
{
char * str= NULL;
GetMemory(str,10);
// str[0] = 'x';//错误,str仍为NULL
return 0;
}
8 C++中的指针类型判断可通过逐步化简的方法实现:
例如 float (**p)[10];
解释方法:float A[10];B = &A;p = &B;所以p是一个指向指向一维数组(A)的指针(B)的指针;
Double *(*gh)[10];
解释方法 Double* A[10]; gh = &A;所以gh是一个指向由10个指向double的指针的数组的指针。
Int(*(*F)(int,int))(int);
解释方法 Int (*A)(int);//A 是一个函数指针参数int返回值int
A (*F)(int,int);//F是一个函数指针参数(int,int)返回值A
所以:F是一个参数为(int,int)返回值为一个参数是int返回值是int的函数指针的函数指针;
Int *((*b)[10]);
解释方法:int *A;// A是指向int的指针
B = A[10];//方括号的是数组,不影响类型 B是由int*类型组成的长度为10的数组
b= &B//b是指向这个数组的指针;
所以b是一个指向长度为10的数组的指针,数组由10个指向整数的指针组成
Double (*f[10])();
解释方法:double (*A)();//A是函数指针,返回double 参数void
f = A[10];//f是A类型函数指针组成的数组
所以f使用10个函数指针组成的数组,这些函数指针没有参数返回double
9. ++i在语句之前执行,i++在语句之后执行
for (int i=0;i<2;i++)与for (int i=0;i<2;++i)等效,自增都放在循环体的最后执行, 等价于:
int i=0;
while(i<2)
i++;//或++i所以没有影响
但是 for (int y=0,i=0;i<2;y=i++)与for (int y=0,i=0;i<2;y=++i)不同
前一个相当于:
int i=0;
while(i<2)
{
y = i;
i++;
}
后者相当于:
int i=0;
while(i<2)
{
i++;
y = i;
}
10. C++中自加操作的执行时机会受到函数的影响,通常自加在一行结束后执行,在函数内的时候是在函数执行完成后运行。
例如:
#include <string>
#include <iostream>
using namespace std;
int Function(int i)
{
cout<<i<<endl;
return i;
}
int main()
{
int i,j =0;
i = (j++)+(j++);
cout<<"i="<<i<<","<< "j="<<j<<endl;
// i=0;j=2//两个++都是最后执行
j=0;
i = Function(j++)+(j++);
cout<<"i="<<i<<","<< "j="<<j<<endl;
// 0
// i=1 j=2
//执行第一个函数是j是0,执行后执行第一个j++在执行加法,最后执行另一个j++
//实际执行相当于
//int x = Function(j)
// j++
// i= x +j
// j++
j=0;
i = Function(j++)+Function(j++);
cout<<"i="<<i<<","<< "j="<<j<<endl;
//0
//1
//i=2 j=2
j=0;
cout<<j++<<j++<<j++<<j<<endl;
// 0123
system("pause");
return 0;
}