C++之引用和函数重载

C++之引用

C语言中有两种传参方式

  传值-----C语言中,在函数调用的过程中会生成一份临时变量,最终把实参的值传递给新分配的临时变量(形参)

  传址-----通过指针接收实参的地址

C++中这里我们引入---引用

  • 引用的概念
    引用不是新定义一个变量,而是给已经存在的变量取了一个别名,编译器不会给引用变量开辟内存空间,它
    和它引用的变量共用同一块内存空间
    类型& 引用变量(对象名) = 引用实体
  int a=10;
    int &ra = a;
  • 引用的特性
    引用在定义时必须初始化  
    一个变量可以有多个引用 
    引用只能引用一个实体
  •  常引用(const类型的引用) 
      const int =10;
      const int &b = a
    
      const int &c  = 10;
    
      double d = 1234;
      const int& rd = d;
     此处的rd与d不是一块空间,rd此时不是直接引用的d,是先将d强转为整形,把浮点数的整数部分取过来, 创建一个临时变量,rd引用的是临时空间,而不是d, 临时变量具有常性rd引用的是常量,需要用const修饰
  • 引用的使用场景(注意不能反回栈空间上的引用)
    作为函数参数
    作为函数返回值

     
  • 效率比较
    传值:效率最低,因为要创建临时变量
    传递值:传引用,效率差别不是很大,基本相同
                

面试题:

1>引用和指针的区别:

  •      相同点:

     a>底层的实现方式相同,都是按照指针的方式来实现的

  •     不同点:

     a>引用在定义时必须初始化,指针没有要求

     b>引用被初始化指向一个对象时,就不能指向其他的对象.

     c>没有NULL引用,只有NULL指针

     d>在sizeof中,引用结果为引用类型的大小,但指针始终是地址*空间所占字节树的大小

     e>引用自加改变变量的内容,指针自加改变了指针的指向

     f>指针需要手动寻址,引用通过编译器来实现

     g>引用比指针安全

2>数组可以引用吗?如果可以,怎么实现?

数组不可以直接引用

正确的方式是:

    int main()
    {
    	int a[10];
    	int (&ra)[10] = a;
     	return 0;
    }

C++之函数重载

   同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同.

  根据参数列表的不同,编译器在编译期间确定调用哪个函数(静态多态)

  main函数不能重载,因为程序的入口只能有一个

面试题:
   1>C语言中为什么不支持函数重载
     C语言底层对于名字的修饰不同(仅在函数名前加下划线)
     c++中,将函数参数类型与函数名绑定在一起(+作用域)
    编译过程一般分为: 预处理—-编译——汇编——链接
    预处理:展开头文件,宏替换,去掉注释,条件编译等工作。生成.i文件
    编译:语法检查,生成汇编代码。 生成.s文件
    汇编:将汇编代码转成机器码 。 生成.o文件
    链接:将之前生成的文件链接到一起,生成可执行文件。 生成.out文件

    所以支持重载问题就出在链接这个阶段上,c语言在链接的时候根据函数名找要调用的函数,而c++而是根据函数名和参数类型来寻找要调用的函数(函数名修饰规则);
   2>C++中函数重载底层是怎么处理的?
   底层的重命名机制将Add函数根据参数的个数,参数的类型,返回值的类型都做了重新命名。(Add@@YHHH@Z)H代表int
   那么借助函数重载,一个函数就有多中命名机制。‘?’表示名称开始,‘?’后边是函数名“@@YA”表示参数表开始,后边的3个字符分别表示返回值类型,两个参数类型。“@Z”表示名称结束。
   3>C++中能否将一个函数按照C风格来编译
   可以按照C风格来编译,只需在函数名前加extern "C" 就可以完成按照C风格来编译

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值