杂记(那些我还容易混淆的c和c++知识)

1:
 定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。
2:
 多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;
在程序编译时多态性体现在函数和运算符的重载上;  
3:
 y引用: 切记要对其进行初始化
   不能再把该引用名作为其他变量名的别名
   引用本身不占存储单元,系统也不给引用分配存储单元
   不能建立数组的引用
4:注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。(都可以利用下表访问具体某一个字符但是指针不可以通过下表更改内容)
 char a[] = "hello world";
 //在程序运行时决定,有换行符,c把字符串当做字符数组来处理
 char *b="zzy";
 //在编译时决定,有换行符,程序在定义字符串指针变量b时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给b
 char *p = a;
 
 cout<< sizeof(a) << endl; // 12 字节
 cout<< sizeof(p) << endl; // 4 字节
 
char str[ ]={"I am happy"}; 
char str[ ]="I am happy";    
//==char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};
//!=char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。

注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的
            char str[ ];
            str="I am happy";(错误)
   
 char *P=new char[];  

p="zfd";
 strlen(p);//长度不包括结束符
 但是strcpy(a,p);//又要包含p的结束符
 //反正谨记:数组分配的字符串不会自动加结束符,但是字符串常量会加("zzy")
5:不能建立数组的运用,数组是若干元素的集合,无法建立一个数组的别名
string foo( );
void bar(string & s);
bar(foo( ));
bar("hello world");//不对 ,原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的
6:
无论是静态,局部还是全局数组只有在定义时才能初始话,否则必须通过其它方法,比如循环操作实现。
任何
int a[3];
static int b[3];
a[3] = {1, 2, 3};
b[3] = {1, 2, 3};
没有在定义时初始化都是错误的!
char *str3;str3="12345";是可以的
7:
使用&取数组的地址,它所取的是整体数组的一个地址
8:
fun1(int *ptr)
{
      ptr[1]=3;
      *ptr=3;
      ptr=array2;//可以把另一个数组名赋给ptr,因为它是一个指针
}
fun2(int arr[])
{
      arr[1]=3;
      *arr=3;
      arr=array2;//也可以,因为arr编译器是按照指针的形式处理的
}


int arrary[100],array2[100];
main()
{
         array=array2;//编译错误"无法修改数组名"
}

posted @ 2016-10-23 09:59  风雨缠舟  阅读(299)  评论(0编辑  收藏  举报