C/C++学习小结

800阅读 0评论2011-12-01 新手来鸟
分类:

1memset是一个字节一个字节地赋值

a[3],memset(a,1,3),a[0]=0x00010101,a[1],a[2]未赋值,所以char型的数组可以赋值,int型全部赋为0也可以)

 

2、数组赋值用双引号的时候要注意默认有\0结尾

a[3]="ab"正确,a[3]="abc"错误,因为要添\0,造成数据溢出,a[3]={'a','b','c'}正确)

 

3、多态的三个条件:继承,虚函数覆盖(函数名,函数的返回类型,形参个数,形参类型全部相同),基类的指针或引用指向派生类的对象。

 

4、有继承关系的情况下,子类的析构函数一定要虚拟(实验证明,基类的析构函数若虚拟了,则子类的析构函数不使用virtual关键字一样可以被调用,相反的,若基类析构函数没有虚拟,即使子类的析构函数虚拟了也不能被调用)。

 

5、纯虚函数:virtual 返回类型 函数名(参数列表)=0(没必要实现的函数用纯虚函数)

 

6、不能实例化的类称为抽象类,有纯虚函数的类一定是抽象类

 

7、指针初始化为NULL或者默认初始化的时候,不能直接赋值(*p = 3),因为此时指针指向一个无效地址。

 

8、拷贝构造函数用引用是因为不用引用的话会无限调用自己的拷贝构造函数,造成崩溃

因为不用引用的话,相当于把实参拷贝给形参,就会调用拷贝构造函数,然后就无限调用了。

 

9、类里面有指针的时候要重写拷贝构造函数和赋值函数

 

10delete后指针的内存释放了,但是指针仍然指向原地址,这时候最好加句“p=NULL,否则就是野指针。

 

11p=new int[2],pch=p,p++,此时释放pch即整块释放,不能释放p,因为不能部分块释放

 

12int* p,int* pi,p=pi,此时释放一个指针后不能释放另一个,因为两个指针指向同一个地址,而同一地址不能释放两次。

 

13、指针的指针(**p)实例化:*p = new int/p = new int *

 

14、通过函数里的局部变量获取地址,并且给这个地址内赋值是绝对不允许的,因为局部变量已经出栈了,可以用static或者引用

 

15、代码段、全局静态段(static)、栈、堆(newmalloc

 

16、在函数里要给指针分配新的空间,应该通过指针的指针

 

17*p="hello",此时hello放在代码段,只是将地址给p,是只读数据

 

18、构造函数执行顺序:父类构造函数-成员-构造函数

 

19char sztext[6];sztext = "hello",不能采用这种方式给字符数组赋值,它只是将“hello”的首地址赋给了sztext,应该采用strcpy

 

20int i = 0x00676665;char *p = (char *)&i;P里的内容“ 'e' 'f' 'g' '\0' (低字节到高字节)

 

21strcpy,strcat存在一个问题,它不检查目标缓冲区能存放多少字节的数据

 

22char一个数组作为一个函数的形参时,它已经退化为一个指针了,无论形参有没有数组下标sizeof都为4

 

23、纯虚函数virtual 函数名()=0,本身绝对不会被执行到,有纯虚函数的类称为抽象类,抽象类不能实例化

 

24bool类型:if(a),if(!a);浮点型:if(f>=-EPSINON&&f<=EPSINON)//EPSINON是定义好的精度;指针类型:if(NULL==p),if(NULL!=p)

 

25int a[5]&a+1相当于&a+sizeof(a[5]),所以当*ptr1=(int *)(&a+1),*(ptr1-1)==5

 

26union里的成员存取都是从统一的首地址开始,大端即高地址存低位,低地址存高位,小端相反

 

27sizeof(enum)=4

 

28(a^b)^b=a,(注:^是按位异或),如此可以不通过第三个临时变量来交换两个数的值

 

29#define X 2

#define Y X*4

#undef X

#define X 3

此时Y=3*4=12

 

30int a[5]a+1是数组元素的首地址下移一位,即第二个数组元素,&a+1是数组首地址下移5位,即第二个数组的首地址

 

31、“一个int型的函数”                 

   “一个返回值为int型的函数”             //函数本身没有类型,返回值才有类型

 

32、当两个指针指向同一块内存,释放的时候容易引起段错误,看下面的例子

Class Department

{

       ……

     Vector emp;

}

Vector dept;

Vector包含了三个指针(begin end size),此时dept里面又有emp,很容易发生段错误,解决的办法是在定义的时候用指针

Department *dep

这里的dep是一个指针而不是对象,所以可以避免调用构造析构,要调用类内成员直接用p->func(),而要压栈也可以dept.push_back(dep)

 

33、如果类中重载了new运算符,会先调用重载的new函数,再调用构造,没有重载的话其实是调用默认的全局new函数

 

34、全局const "hello" ==> 代码区

    局部static ==> 全局区

    局部const ==> 局部栈

 

35scanf(“%*c”)

    Fflush(stdout)

清缓存

上一篇:分析DMA
下一篇:Python乱码问题