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

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对象作为函数形参或返回值时只能使用指针或引用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值