C++|类和对象的引用

缺省参数

1.全缺省

void TestFunc(int a = 10, int b = 20, int c = 30) 

{

 cout<<"a = "<<a<<endl;

 cout<<"b = "<<b<<endl;

 cout<<"c = "<<c<<endl; 

}


2.半缺省(部分缺省)

void TestFunc(int a, int b = 10, int c = 20) {
 cout<<"a = "<<a<<endl;
 cout<<"b = "<<b<<endl;
 cout<<"c = "<<c<<endl; }

注意:

  • 必须从右往左缺省,特别要注意不可以去间隔着赋值

  • 缺省参数不能在函数声明和定义中同时出现

    可以单独在声明出现(建议在声明时使用)

    也可单独在定义出现

    但是不能同时出现

函数重载

参数的 个数/ 类型 / 顺序 不同

  1. 类型不同
int Add(int left, int right) 

double Add(double left, double right) 

  1. 顺序不同
//顺序不同
f(int a , float b )
f(flaot a, int b )
  1. 参数个数不同
 //数据类型不同
 f(int a,int b,int c)
 f(int a,int b)

问:缺省值不同,能不能构成重载?

不构成

主要是形参的问题,和缺省没任何关系。

问:一个含有缺省值,一个无缺省值,是否构成重载?

构成

传参的时候是构成重载的,但是不传参的时候存在二义性

引用

引用在语法层面 没有开辟新的空间,只是一个别名而已

只是对原来的空间取原名称 叫做 B

  • 引用在定义的时候必须初始化

  • 一个变量可以有多个引用

  • 引用一旦引用一个实体,再不能引用其他实体(从一而终,是一个人的,永远是他的)

    int a = 10;
    int&b = a;
    int c =20;
    b = c;//这里是什么意思?
    	  //是b变成c的别名?	 ×
    	  //还是把c赋值给b?    √
    

引用有什么作用?

  • 1.引用做参数

  • //C的交换
    void swap(int* p1,int* p2)
    {
    	int  t  = *p1;
        *p1 = *p2 ; 
        *P2 = t;
    }
    
    int main()
    {
    	itn x= 0,y =10;
        swap(&x,&y);
        return 0;
    }
    
    
    //C++的互换
    void swap(int& rx, int& ry)
    {
        int t = rx;
        rx = ry;
        ry = t;
    }
    
    int main()
    {
        int x = 0, y = 10;
        swap(x, y);
        cout << x<<"  " << y;
        return 0;
    }
    

    语法没问题但是使用有问题的情况

    传址、传值、传引用 是构成函数重载的 (语法层面是没有问题的,但是实际应用是有问题的)

    但是调用的时候存在歧义,不知道调用哪个(调用不明确)

    引用的使用场景

  • 引用做参数

  • 传引用返回 vs 传值返回

    • 传值返回

    如果是传值返回的话: 创建一个临时变量,而不是将函数中原变量进行赋值

    (原函数已经消失,栈帧还给操作系统) 如果使用原变量是非法的、可能是随机值

    那么临时变量存在哪里?

    如果比较小的话 4/8bit——>寄存器

    如果比较大的话 ——>临时变量放在上一个栈帧(调用他的栈帧中)

    • 传引用返回/引用做返回值(引用的意思就是,不会生成新的拷贝返回,而是直接返回引用值)

      就像修改指针一样,直接把引用值给修改,达到不需要寄存器、栈帧返回的效果

    image-20211215164915312 image-20211215165756873

    当前代码的问题:

    1. 存在非法访问,生成的引用是 对于c的引用,c已经销毁,所以非法
    2. 如果Add函数栈帧销毁,已经清理空间了,那么对于c的引用就是随机值(清理取决于编译器)

使用场景有哪些?

  1. ​ 日常引用不建议用引用返回

​ 但是,如果函数返回的时候,出了函数的作用域,如果返回对象还在(没有还给系统)(全局变量、静态量、malloc出来的数组、)则可以使用引用返回(在即引用,不在传值

​ 如果已经还给系统了,就必须使用传值返回。

传值vs传引用 区别:

  1. 传值是把c的结果传给一个临时变量,而传引用是传c的别名(但是c已经销毁)

  2. 值返回每次都需要拷贝,但是传引用不需要拷贝,开销较小

引用的主要作用体现在传参和传返回值:

  1. 引用传参和传犯规之,有些场景下面,可以提高性能。(大对象/深拷贝对象)
  2. 引用传参和传返回值,输出型参数和输出型返回值。(有些场景形参的改变可以改变实参)
  3. (有些场景)改变返回对象

特殊的引用:常引用(const &)

int main()
{
const int a =10;
int &b = a;      //权限放大   只读->可写可读
    
const int &b = a;//权限不变   还是只读

int c = 10;
const int &d c ;//权限缩小,可读可写->可读
return 0;
}
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值