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是一个函数指针参数(intint)返回值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];//fA类型函数指针组成的数组

所以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

//执行第一个函数是j0,执行后执行第一个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;

}

 

 

   

 

posted @ 2013-04-28 11:36  Ghost_zhao  阅读(543)  评论(0编辑  收藏  举报