C++笔试面试常考知识点汇总(四)

3/8/2017来源:ASP.NET技巧人气:2039

128:引用 引用就是某个对象的别名,其最主要作用是函数传参。

//变量引用 int val=1; int &refval=val; refval=2; cout<<val<<endl;//输出2 //常量引用 const int val = 1; const int &ref1 = val; // 引用了一个一般常量 const int &ref2 = 12; // 引用了一个字面常量 //int &ref3 = val; // 错误,常量必须要使用常量引用,ref3是个变量引用 int var = 2; const int &ref2 = var; // 常量引用指向了一个变量 //ref2 = 3; // 不允许通过常量引用来做任何更改操作 var = 3; // 但是可以用原始变量来更改内容

总结一下就是: 常量引用可以引用常量或者变量,但不能通过引用来更改其数据内容; 变量引用只能引用变量,且用引用更改变量效果与直接更改变量一样。 补充:非常量引用类型必须严格匹配,常量引用可以在内置类型之间相互引用 129:枚举 枚举是一组可选常量值,既然是一组可选值说明包含多个常量。枚举定义语法如下

enum val{val1 = 2, val2 = 4, val3} // 最后一个内容没有显示给值等价于 val3 = 5

如果不指定值默认第一个值从0开始下一个依次+1递增

枚举的每一项都是一个唯一的const类型值,上面的定义有点类似于:

const val1 = 2; const val2 = 4; const val3 = 5;

由于是const的,所以不允许更改。

枚举项和int类型值有对应关系,但是二者只能单向转换,枚举可以自动转成int,而int却不能转成枚举

val a = val2 ; // 枚举之间赋值初始化 int b = val2 ; // 枚举转成int并初始化 val a = 2 ; // int 不能转成枚举,无法初始化

130:#ifndef的使用 为防止头文件重复包含所造成的编译错误,在定义头文件时,应将头文件置于#ifndef 和#endif中。格式如下:

#ifndef<头文件名> #define<头文件名> ...头文件代码 #endif;

131:

char a[]{'a','b','c','\0'} ; // 第一种数组定义语法 char a[] = “abc” ; // 第2种数组定义语法,数组大小为4 char *a = “abc” ; // 指针表示法

c风格的字符串有多个操作函数: strlen(), strcpy(),strcat()以及strcmp(),分别表示长度,拷贝,连接和比较。 132:指向常量的指针和常量指针

const int a = 123 ; const int *cur =&a ; //指向常量的指针

需要注意:指向常量指针可以指向常量也可以指向变量,但无论如何都不能对它所指内容做更改,即使它实际指向了变量,不过可以更改这个指针的指向

int c =456 ; cur = &c ; // 更改了指针的指向,现在指向的实际是个变量 *cur = 789 ; // 不允许,虽然指向的是变量但系统认为是常量所以不允许修改 //常量指针 const int a = 123 ; int b = 456 ; int *const cur1 = &a ; // 此时不允许允许 *cur = 789,因为指向了一个常量 int *const cur2 = &b ; // 此时允许允许 *cur = 789,因为指向了一个变量 cur1 = &b ; // 错误,不允许更改指针的指向

常量指针不能重新再做指向更改,但也许可以修改它指向的对象的值,这取决于它指向的值是变量还是常量。 另有指向常量的常量指针。 133:函数传参 1)非引用传参(值传递):函数内部对参数的修改不会反映到函数外部。 2)引用传参:函数内部对参数的修改会反映到函数外部,当参数比较大的时候,可以用引用传参,可以避免拷贝参数时造成的大的开销。 3)形参为指针:在函数内对指针本身(地址,也即指向)进行修改,不会影响到外部实参。但是对指针指向内容进行修改,会反映到外部实参。

void funct(int *i) { *i = 3; // 对指向内容做更改 i = 0; // 对指针做更改 } int it = 2; int *itPR = &it; cout << itpr << *itpr << endl; // 输出: 0040f9d8 2 funct(itpr); cout << itpr << *itpr << endl; // 输出: 0040f9d8 3

但要注意的是,函数内两条语句的顺序会影响到执行结果。如下:

void funct1(int *i) { int k=10; i = &k; // 对指针做更改 *i = 0; // 对指向内容做更改 }

此时反映到外部,函数执行前后指针地址是一致的,指针指向值都为2。相当于在funct1中重新定义了一个指针,与形参传递过来的指针指向不同的对象。 134:关于指针形参的交换函数

void swap_int_ptr_addr(int *a,int *b) { int *temp;//交换形参的地址,其结果和值传递一样 temp=a;//只是指针的指向发生了变化,而地址中的值没有变 a=b; b=temp; } void swap_int_ptr(int *a,int *b) { int temp;//交换形参的指针指向值,结果与引用传递相同 temp=*a;//修改指针所指向地址中的值 *a=*b; *b=temp; } void swap_int_ptr_1(int *a,int *b)//错误 { int *temp;//没有分配内存 *temp=*a;//将在拷贝时随机分配一个地址 *a=*b; *b=*temp; }

135:内联函数:在编译期间会在函数调用处直接用内联函数语句代替的一种函数,要求函数语句必须简单短小。内联函数有较好的性能,因为函数在调用时系统刚要分配栈空间,内联函数会直接展开代码,所以不会有栈空间分配步骤。其特点决定了,若修改内联函数,就需要对所有用到内联函数的地方重新编译。 136:函数重载 函数重载是指返回类型相同,函数名相同但参数不完全相同的多个函数。函数调用时会根据传递的参数类型和个数寻找最合适的重载函数。 不但参数类型和个数可以作为重载依据,当形参数是引用或指针时 const 可用作重载依据。const引用或const指针形参只能用const对象初始化,而当没有普通引用函数时,普通变量也可以使用形参为const引用函数。 137:IO对象无法复制或者赋值,所以IO对象作为函数形参或返回值时只能使用指针或引用。