C++学习笔记二

来源:互联网 发布:中小学教育网网络课程 编辑:程序博客网 时间:2024/05/23 23:09

        这两天主要看了控制语句和函数及预处理两个章节的内容。控制语句这一块和前面所学的高级语言都是大同小异,所以很快就过了一遍。

        函数和预处理这一章里,关于函数讲的东西和C基本一致,但是有一些之前没用过的东西还是在这里列出来。

        1.函数的参数传递中的引用传递:按照书本的解释,引用是给一个已知变量起个别名,之后对引用进行操作就可以对被这个引用多引用的变量进行操作。引用的使用方法如下:

         int val;

         int &refval = val;这里refval就是val的引用,赋值语句refval=3则val的值也变为3,val=4,则refval的值也变为4。但是我对引用和指针有点搞不清楚了,书上列出引用不同于指针之处就是不能动态分配内存。函数使用引用的方式传递参数例子如下:

         void main(){

            int a=2,b=10;

            swap(a,b);

}

         void swap(int &x,int &y){...}

这样的话就相当于把变量a和b的地址传过去了。那么swap中如果改变了x和y的值,那么a和b的值也会被改变。

   

           2.函数的默认参数值:

           允许函数的说明或定义时给一个或多个参数指定默认值。在调研时,可以不给参数,按指定的默认值进行工作。举例如下:void initialize(int p1,int p2=0)//注意,这样的定义形式是在代码开头的函数说明部分,而不是在代码中间的函数。所以如果这样的调用是正确的:initialize(1),参数P2会自动初始化为0。

           需要注意,默认参数不能放在中间,否则无法判断哪些参数使用默认值。

           可以通过重新说明函数使本来不带默认值的参数带上默认值,但是在一个文件中,函数的某一参数只能在一次说明中指定默认值。举例如下:

           void f1(int p1,int p2=0);

           void f1(int p1=1,int p2);//这样是合法的

然而下面:

           void f1(int p1,int p2=0);

           void f1(int p1,int p2=1);//这样是不合法的,因为在同一个文件中对一个参数多次指定了默认值。

           

           为了更清楚地说明这个概念,用以下代码作为提醒:

           #include  <iostream.h>

           void init(int p1,int p2=0);

           void init(int p1=1,int p2);

           void main()

           {

                init();

                init(0);

                init(1,1);

           }

           void init(int p1,int p2)

           {

               cout << "p1=" << p1 << ",";

               cout << "p2=" << p2 << ",";

           }

输出的结果如下:

           p1=1,p2=0

           p1=0,p2=0

           p1=1,p2=1

可能会犯错的地方是第一个声明声明p2为0,第二个声明只声明了p1为1,容易以为第二个声明会使第一个声明的p2无效,其实不会。

 

         3.内联函数:用inline关键字声明。就是在调用内联函数时编译程序会自动用函数体代替函数调用,可以节省出栈入栈等开销,提高运行速度,但是以更长的代码长度为代价。另外,内联函数中不能定义任何静态变量,使用任何循环、switch、goto语句,不能说明数组,不能是递归的。

 

         4.静态局部变量:局部变量的空间分配是在执行到变量所在的局部域的时候,程序离开局部域,局部变量所占空间就会被释放,因为每次执行到局部域使用该变量时都要从新初始化。而静态局部变量的值能一直保持,而且可以由系统隐式初始化为0。举例如下:

          int i;

          for(i=0; i<3; i++)

          {

             int temp=1;

             static int perm=1;

             cout << "temp=" << temp <<",perm=" << perm <<endl;

             ++temp;

             ++perm;

          }

程序的执行结果如下:

         temp=1,perm=1

         temp=1,perm=2

         temp=1,perm=3

 

         5.静态全局变量:只能在定义的文件内访问的全局变量

         6.函数前加static关键字:和静态全局变量作用相同,只能在定义它的文件中使用。内联函数和定义为const的常量和函数都是隐含的静态变量。

 

         7.域运算符:当有同名的局部变量和全局变量时,在变量前加::表示使用的是全局变量。

         8.外部变量,使用另一个文件定义的非静态全局变量。在说明外部变量时不能给变量赋上初值,否则出错,关键字extern。

         

         9.宏定义:比较简单,要注意的是宏后面的定义的表达,如:#define hong (hong2+10)如果使用以下形式会出错#define hong hong2+10。即括号不能省略。可以在宏定义里使用另外的宏定义,如上面的hong2就是另外的宏定义。

 

         10.头文件:用<>指由系统提供的并放在指定目录中的头文件,用" "指用户自己定义的放在当前目录或其他目录下的头文件或源文件。注意,可以将宏定义组成一个文件,然后可以用#include命令将这些符号常量包含到自己所写的源文件中。

 

         说的比较啰嗦,但是都是我认为对自己比较重要且容易忽略的细节。另外,我用的这本教材《C++程序设计》(清华大学出版社 李春葆 章启俊编著)应该是不适合初学者使用的,对于学习过高级语言,特别是C的人这本教材还是有所帮助的,如果是入门的人,看谭浩强写的书应该会比较好,毕竟讲的很详细。          

原创粉丝点击