二-从C到C++

本章会介绍一些C++拓展的非面向对象的功能

  1. 引用

1 概念

引用从一定程度上讲是指针的平替,几乎被所有的面向对象语言所使用。引用相当于对某一目标变量起"别名"。

操作这个别名,与操作原变量一样。(操作同一块地址)不能有相同别名

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`
    `// b是a的引用`
    `int` `&b = a;`
   
`    cout << a <<` `" "` `<<` `&a << endl;` `// 1 0x61fe88`
`    cout << b <<` `" "` `<<` `&b << endl;` `// 1 0x61fe88`
    `return` `0;`
`}`
`

2 引用的性质

1)可以改变引用的值,但是不能再次成为其他变量的引用

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`
    `// b是a的引用`
    `int` `&b = a;`
    `int c =` `3;`

`    b = c;` `// 只是单纯的赋值,不是引用,b还是a的引用`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 1 0x61fe88`
`    cout << b <<` `" "` `<<` `&b << endl;` `// 1 0x61fe88`
`    cout << c <<` `" "` `<<` `&c << endl;` `// 1 0x61fe88`
    `return` `0;`
`}`
`

2)声明引用时,必须要初始化

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`

`//    int &b; // 错误 引用必须要初始化`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 1 0x61fe88`
    `// cout << b << " " << &b << endl; // 1 0x61fe88`
    `return` `0;`
`}`
`

3)声明引用的时候,不能初始化为null

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`

`//    int &b = NULL; // 错误,引用不能初始化为NULL`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 1 0x61fe88`
    `// cout << b << " " << &b << endl; // 1 0x61fe88`
    `return` `0;`
`}`
`

4)声明引用的时候,初始化的值可以是纯数值,但是此时需要使用const关键字修饰引用,表示该引用为常量引用,这样的引用的值不能改变。

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`

    `const` `int` `&b =` `444;`
    `// b = 2; // 错误 常量引用的数值不能被改变`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 1 0x61fe88`
`    cout << b <<` `" "` `<<` `&b << endl;` `// 1 0x61fe88`
    `return` `0;`
`}`
`

5)可以将变量引用的地址赋值给一个指针,此时指针指向的还是原来的变量。

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`
    `int` `&b = a;`
    `int` `*c =` `&b;//指针c`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 1 0x61fe88`
`    cout << b <<` `" "` `<<` `&b << endl;` `// 1 0x61fe88`
`    cout <<` `*c <<` `" "` `<< c << endl;` `// 1 0x61fe84`
    `return` `0;`
`}`

`

6)可以使用const修饰引用,此时如果原变量的值改变,引用的值也改变

复制代码
#include <iostream>`

`using` `namespace std;`

`int` `main()`
`{`
    `int a =` `1;`
    `const` `int` `&b = a;`
`//    b++; // 错误,b是只读的`
`    a++;`

`    cout << a <<` `" "` `<<` `&a << endl;` `// 2 0x61fe88`
`    cout << b <<` `" "` `<<` `&b << endl;` `// 2 0x61fe88`
    `return` `0;`
`}`

`

【思考】

写一个函数,函数有两个参数a和b,函数的功能是交换两个传入的参数【原来变量】的值。

复制代码
#include <iostream>`

`using` `namespace std;`
`//c语言普通模式`
`void` `type1(int` `*a,int` `*b)`
`{`
    `int c;`
`    c=*a;`
    `*a=*b;`
    `*b=c;`
`}`
`//c语言异或`
`void` `type2(int` `*a,int` `*b)`
`{`
    `*a=*a^*b;`
    `*b=*a^*b;`
    `*a=*a^*b;`
`}`
`//不会产生副本`
`void` `type3(int` `&x,int` `&y)`
`{`
`    x=x^y;`
`    y=x^y;`
`    x=x^y;`

`}`
`int` `main()`
`{`
    `int a =` `1;`
    `int b =` `5;`

`    cout <<"a="` `<< a  <<` `" "` `<<` `&a << endl;`
`    cout <<"b="` `<< b <<` `" "` `<<` `&b << endl;`
`//    type1(&a,&b);//c语言普通模式`
`//    type2(&a,&b);//c语言异或`
    `type3(a,b);//不会产生副本`
`    cout<<"----------------------"<<endl;`
`    cout <<"a="` `<< a  <<` `" "` `<<` `&a << endl;`
`    cout <<"b="` `<< b <<` `" "` `<<` `&b << endl;`
    `return` `0;`
`}`


`

引用作为参数进行定义的时候,在参数传递时,是不会产生副本的,这样会提高运行效率,我们在正常编程当中,建议使用引用进行传递参数。

引用形参,在不参与计算的情况下,我们建议使用const进行修饰。以达到引用的安全性。

相关推荐
C137的本贾尼5 分钟前
JDBC 编程:用 Java 连接 MySQL
java·开发语言·mysql
AI视觉网奇9 分钟前
three-bvh-csg glb分割
开发语言·前端·javascript
牢姐与蒯11 分钟前
c++数据结构之c++11(二)
开发语言·c++
z2005093014 分钟前
【linux学习】深入理解 Linux 进程间通信:管道的艺术与实现
linux·开发语言
lcj251115 分钟前
【stack、queue、deque、priority_queue】C++ 栈 / 队列 / 优先级队列全解析!手撕实现 + 二叉树层序遍历(附源码)
开发语言·c++·笔记
兵哥工控16 分钟前
高精度微秒延时函数实现顺控工控项目实例
c++·mfc·硬件高精度计时器
j_xxx404_17 分钟前
Linux线程池硬核解析:从固定线程池、单例线程池到线程安全、死锁与锁模型|附源码
linux·运维·服务器·c++·安全·ai
dust_and_stars19 分钟前
在Ubuntu 24.04上设置Jupyter Notebook远程访问
linux·ubuntu·jupyter
牛油果子哥q22 分钟前
【C++静态成员】C++静态成员终极精讲:静态成员变量、静态成员函数、内存布局、对象共享机制、工程实战、深浅坑点与面试满分总结
c++·面试
x_lrong24 分钟前
Ubuntu下安装配置Claude Code
linux·ubuntu·elasticsearch