西方现代艺术教案:C++ primer学习笔记一

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 05:26:10
第一部分,基本语言


1 变量初始化规则
  1)内置类型变量的初始化
     内置类型变量是否初始化取决于变量定义的位置。在函数体外定义的变量都初始化为0,否则不进行自动初始化。
  2)类类型变量的初始化
     如果定义某个类的变量时没有提供初始化式,则使用默认构造函数。有的类没有默认构造函数,则每个定义都必须提供显式的初始化式。

2 声明和定义
   变量的定义(definition)用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。声明(declaration)用于向程序表明变量的类型和名字。
   定义也是声明。
    extern int i; //declaration
    int i;        //declares and defines i
    变量可以声明多次,但只能定义一次.如果声明有初始化式,则即使声明标记为extern它也被当作定义。只有当extern声明位于函数外部时,才可以含有初始化式。

3 定义const对象
    常量在定义后不能被修改,所以定时必须初始化。
    与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。
    把一个非const变量定义在一个文件中,做了合适说明则可以用在其他文件中,
    //file1
    int count;  //definition
    file2
    extern int count ; uses count from file1
    ++count;
    非const变量默认为extern,要使const变量能够在其他文件中访问,必须显式指定其为extern.

4 引用
    引用就是对象的一个别名,在实际程序中,引用主要做为函数的形式参数。
    引用必须用与该引用同类型的对象初始化。
    int i=1; int &r=i; //ok
    int &r=1; int &r; //这两个都是错的
    只有const引用才能用常量初始化,即
    const int &r=3; //ok
    int i=4;
    const int &r2=r+i; //ok,

5 下标和指针
    在表达式中使用数组名实际上使用的是指向数组第一个元素的指针。
    在使用下标访问数组时,实际上是使用下标访问指针。只要指针指向数组元素,就可以对它进行下标操作。
    int ia[]={0,1,2,3,4};
    int i=ia[0];         // ia points to the first element in ia
    int *p = &ia[2];     //ok,p points to the elements indexed by 2
    int j = p[1];        //ok,p[1] equivalent to *(p+1) p[1]is the same element
                         // as ia[3]
    不将数组转换为指针的例外情况有:数组用作取地址(&)操作符的操作数或sizeof操作符的操作数时,或用数组对数组的引用进行初始化时,不会将数组转换化为指针。

6 for 循环一个性质:
    只要定义的多个变量具有相同的类型,就可以在for循环的初始化语句中同时定义它们。

7 指针和typedef
   typedef string *pstring;
   const psting cstr; //const修饰的是pstring的类型,即相当于 string *const cstr;

8 动态分配的数组
    int *pia2= new int[10]();//圆括号要求编译器对数组做值初始化,本例中即把数组元素都设置为0,对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。
     允许动态分配空数组
     size_t n = get_size();
     int *p =new int[n];
     for(int *q=p; q!=p+n; ++q)
     释放动态空间
     delete [] p;

9  函数的参数传递
   每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。因此,函数中的形参是const类型或引用类型的也没有问题。
   令人吃惊的是,尽管函数的形参是const,但是编译器却将函数的定义被视为其形参被声明为普通的非const类型。也就是说不能用形参是否是const类型来对函数进行重载。
    非const引用的形参,只能与完全同类型的非const对象关联。也就是说这样的形参既不能用const对象初始化,也不能用字面值或产生右值的表达式实参传递给它。因此应该将不需要修改的引用形参定义为const引用。
    仅尖形参是引用或指针时,形参是否为const才有影响。
 
    数组有两个特殊的性质,:(1)数组不能复制,所以无法编写使用数组类型形参的函数。
                        (2)使用数组名时,数组名会自动转化为指向其第一个元素的指针,因此处理数组的函数通常通过操纵指向数组中的元素的指针来处理数组。
      void printvalue(int *){}
      void printvalue(int[]){}
      void printvalue(int[10]){}这三个定义是等价的,形参类型都是int*,但通常用第一种。
    多维数组的传递:void printvalue(int (*matrix)[10],int r){}此句将matrix声明为指向含有10个int型元素的数组的指针。也可用数组语法定义多维数组,与一维数组一样,编译器忽略第一维的长度,故最好不要把它包括在形参表中, void printvalue(int matrix[][10],int r){}与第一个相同,都是指针。

10  C++中的文件名
      由于历史原因,IO标准库使用C风格字符串而不是C++ string类型的字符串作为文件名。在创建fstream对象时,如果调用open或者使用文件名作为 初始化式,需要传递的实参应为C风格字符串,而不是标准库string对象。比较好的方法是将文件名读入string对象,然后调用c_str成员获取C风格字符串。