为何C++既有指针也有引用?

本文探讨了C++中引用的概念及其在运算符重载中的应用。通过对比指针与引用在函数参数传递上的不同表现形式,阐述了引用在简化语法和提高代码可读性方面的作用。

 C++ 的指针继承于 C,若要移除指针,势必造成严重的兼容性问题。引用有几方面的用处,但我在 C++ 中引入它的主要目的是为了支持运算符重载。例如:

                void f1(const complex* x, const complex* y) // 没有引用
                {
                        complex z = *x+*y; // 难看
                        // ...
                }

                void f2(const complex& x, const complex& y) // 使用引用
                {
                        complex z = x+y; // 看起来不错
                        // ...
                }

    更一般地,如果你想要同时拥有指针功能和引用功能,那就需要两种不同的类型(C++ 里就是这么干的)或者对一个单独的类型有两套不同的操作。例如,如果采用单一类型的话,则需要有给被引用的对象赋值的操作以及给引用/指针赋值的操作。这 可通过使用不同的运算符来完成(Simula 里就是这么干的)。例如:

                Ref<My_type> r :- new My_type;
                r := 7; // 赋值给对象
                r :- new My_type; // 赋值给引用

    或者,你也可以依赖类型检测系统(重载)。例如:

                Ref<My_type> r = new My_type;
                r = 7; // assign to object
                r = new My_type; // assign to reference

原文地址http://www.research.att.com/~bs/bs_faq2.html#pointers-and-references

C++引用指针在使用场景上存在诸多区别,以下是详细介绍: ### 赋值和指向变更 指针可以被重新赋值,能够随意改变指向,而引用一旦被初始化就能再指向其他变量,必须从一而终。例如,在函数传参时,如果需要改变指针指向,就只能使用指针。 ```cpp #include <iostream> void changePointer(int*& ptr) { int b = 20; ptr = &b; } int main() { int a = 10; int* pa = &a; changePointer(pa); std::cout << *pa << std::endl; return 0; } ``` ### 空值处理 指针可以为空(即指向空地址),而引用必须总是指向某个对象,存在空引用。在需要表示“无指向”的情况时,只能使用指针。比如在链表中,链表节点的指针域在链表末尾可以指向`nullptr`。 ```cpp struct Node { int data; Node* next; Node(int val) : data(val), next(nullptr) {} }; ``` ### 算术运算 指针可以进行算术运算(如加减),而引用能进行算术运算。在处理数组时,指针的算术运算非常有用,可以方便地遍历数组元素。 ```cpp #include <iostream> int main() { int arr[5] = {1, 2, 3, 4, 5}; int* ptr = arr; for (int i = 0; i < 5; ++i) { std::cout << *(ptr + i) << " "; } std::cout << std::endl; return 0; } ``` ### 多级指向 指针可以有多级,例如二级指针,而引用可以。在需要多级间接访问时,只能使用指针。 ```cpp #include <iostream> int main() { int a = 10; int* pa = &a; int** ppa = &pa; std::cout << **ppa << std::endl; return 0; } ``` ### 函数传参和返回值 在函数传参时,如果希望函数内部可以修改实参的值,既可以使用指针也可以使用引用。但引用的语法更简洁,直接访问所指向的对象,而指针需要通过解引用符`*`来访问其所指向的对象。在函数返回值方面,如果函数需要返回一个对象,且希望调用者可以修改该对象,使用引用返回会更合适,但要确保返回的引用指向的对象在函数外部仍然有效,比如返回全局变量、静态变量或堆上的变量等 [^3]。 ```cpp #include <iostream> // 引用传参 void swap(int& a, int& b) { int temp = a; a = b; b = temp; } // 引用返回 int& func() { static int a = 0; return a; } int main() { int x = 5; int y = 10; swap(x, y); std::cout << "x = " << x << ", y = " << y << std::endl; func() = 20; std::cout << func() << std::endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值