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种数组定义语法,数组大小为4char *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 = ⁢cout << itpr << *itpr << endl; // 输出: 0040f9d8 2funct(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对象作为函数形参或返回值时只能使用指针或引用。
新闻热点
疑难解答
图片精选