c++基础の引用、const

来源:互联网 发布:驱动中国双十一数据 编辑:程序博客网 时间:2024/06/05 09:46

一些c++对于c语言的加强
1、int fun()在c语言中表示返回值int型的函数,括号里的参数是任意的;
但是在c++中也表示int 型返回值的函数,但是括号里是没有参数的相当于int fun(void)
也就是说在c++中他强调的是类型,所有程序的所有元素都必须指明类型;

2、c++中的表达式的返回值是变量本身,而不是变量的一个值,所以可以把返回值当作左值来使用
例如:(a > b? a:b) = 10;
那么在c语言中怎么把表达式的返回值当作左值呢?
可以返回变量的地址来实现!因为返回变量地址,就可以对变量的那块内存空间进行操作!
*(a > b? &a: &b) = 10

3、const
在c中 他修饰的是变量的常量值也就是常变量,虽然是修饰的常量值但是还是会给这个变量分配空间;
但是在c++中 就是单纯的修饰的一个常量,所以不会给他分配地址空间,直到遇到&,或者extern的时候才会给这个常量分配地址空间,然后在编译的过程中如果编译器发现了这个常量就会直接用符号表中的值来代替这个常量,并不会使用这个分配了地址空间的常量;
也就是说
(1)C语言中const变量是只读变量,有自己的存储空间

(2)C++中的const常量
可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用
当使用&操作符取const常量的地址

4、c++的引用,看作是已经定义的变量的别名;

#include <iostream>int main(){    //给变量a分配了一块内存空间;a就是那块内存空间的名字    int a;    //这时候定义的变量b的地址指向变量a,把&b看作是指针,指向a的内存空间,所以b代表了a ;    int &b = a;    b = 20;    printf("%d,%d\n",a,b);    printf("%p,%p",&a,&b);    return 0;}

引用的本质:
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同
引用在C++中的内部实现是一个常指针;
转换的形式 int *const a = &a;

记住一个形式: 修饰+ & + 变量 =(修饰)变量
常引用:
const int &a = 10;
这里a 是一个常引用,它现在代表了10这个常量的地址空间(编译器分配的空间,在把10 这个值复制到那个空间)的别名

5 内联函数

inline int max(int a ,int b){    return (a > b? a:b); }int main(){    int a = 10;    int b = 20;    printf("%d\n",max(a,b++));    return 0;}

// 内联函数代替宏函数
// 在普通函数前加 关键字 inline 将函数变成内联函数
// inline 必须要和函数定义放一起,如果和函数声明放一起会被忽略
// define 是预处理器处理的 inline 是编译器处理的
// define 没有函数参数检测,返回检测,作用域检测,inline 工作方式像一个函数
// 所以会有参数类型检测等
// inline是向请求在调用该函数的时候进行函数体的替换,编译器可能拒绝内联请求
// 如果内联成功,编译完以后代码是没有这一段函数的

// 内联函数函数体不能过长,最好不要超过 5 行
// 不能有循环语句,复杂的 if 语句
// 不能对内联函数进行取地址操作

6、函数的默认参数
(1)在c++中函数的的参数如果什么都不写的话,就默认是无参数的函数
int func() =====>int func(void)

(2)函数的默认参数:当函数调用没有提供该参数的值,会使用默认的值

int mul(int a, int b = 10){    return a * b;}

(3)如果给函数一个参数赋了一个默认的值,那么这个参数后面的所有参数都必须要有默认值

int mul2(int a, int b = 5, int c = 6){    return  a*b*c;}

7、函数的重载
(1)概念
函数名相同,函数的参数不一样,根据调用的时候传的参数类型决定调用哪一个函数
(2)函数重载的规则
参数个数不同,参数顺序不同,参数类型不同;满足一个条件即可

(3)引用做为参数的时候,当常量性不一样的时候可以重载;

int func(int &a,int &b) //接收变量{    return a+b;}int func(const int &a,const int &b)//接受常量;{    return a - b;}int main(){    int a = 20;    int b = 10;    func(20,10);//第一个子函数不符合,就找第二个;    func(a,b);//第一个函数就符合,就不会在找其他的函数}

(4)定义一个函数指针类型,有一个void返回值,参数int 类型

typedef void (*FUNC)(int );int print(int a){    printf("%d\n",a);}int print(int a,int b){    printf("hello\n);}int main(){    FUNC func = print; //编译器首先会去找和函数指针类型一样的print函数    print(10);      return 0;}