当前位置: 首页 > news >正文

【C++基本功】C++ 选引用与还是指针?彻底详细讲解

C++ 引用与指针详细讲解

引用和指针是 C++ 中两个非常重要的概念,它们都提供了间接访问变量的机制,但在语法、用途和安全性上有显著区别。下面我将详细讲解引用的概念、用法、与指针的区别,以及它们在实际编程中的应用。


1. 引用(References)

1.1 什么是引用?

引用是变量的一个别名(alias),它为已存在的变量提供了一个新的名称。一旦引用被初始化为某个变量,它就始终指向该变量,不能再引用其他变量。

特点

  • 引用必须在声明时初始化。

  • 引用一旦初始化后,不能改变其绑定的对象(即不能重新绑定到其他变量)。

  • 引用本身不占用额外的存储空间(编译器通常将其实现为指针,但对程序员透明)。

  • 引用必须引用一个有效的对象,不能为 null(不像指针可以为 nullptr)。

1.2 引用的基本语法

type &引用名 = 变量名;

示例:基本引用

#include <iostream>int main() {int a = 10;int &ref = a;  // ref 是 a 的引用std::cout << "a = " << a << ", ref = " << ref << std::endl;  // 输出: a = 10, ref = 10ref = 20;  // 通过引用修改 a 的值std::cout << "a = " << a << ", ref = " << ref << std::endl;  // 输出: a = 20, ref = 20return 0;
}

解释

  • int &ref = a; 声明了一个名为 ref 的引用,它是变量 a 的别名。

  • ref 的任何操作实际上都是对 a 的操作,反之亦然。

1.3 引用的用途

1.3.1 函数参数传递(引用传参)

引用常用于函数参数传递,以避免拷贝大对象,同时允许函数内部修改调用者的变量。

示例:通过引用修改函数外部的变量

#include <iostream>// 通过引用传参,函数内部可以修改调用者的变量
void increment(int &num) {num++;
}int main() {int value = 5;std::cout << "Before increment: " << value << std::endl;  // 输出: 5increment(value);std::cout << "After increment: " << value << std::endl;   // 输出: 6return 0;
}

解释

  • void increment(int &num) 函数参数 num 是一个引用,绑定到调用者传递的变量 value

  • 在函数内部对 num 的修改直接影响 value

1.3.2 返回引用

函数可以返回引用,允许调用者直接操作函数返回的对象,但需要注意返回的引用必须绑定到一个有效的、生命周期足够长的对象,以避免悬空引用(dangling reference)。

示例:返回引用

#include <iostream>int global = 100;// 返回全局变量的引用
int& getGlobal() {return global;
}int main() {std::cout << "Before: " << getGlobal() << std::endl;  // 输出: 100getGlobal() = 200;  // 通过返回的引用修改全局变量std::cout << "After: " << getGlobal() << std::endl;   // 输出: 200return 0;
}

注意

  • 返回局部变量的引用是危险的,因为局部变量在函数结束后会被销毁,导致返回的引用成为悬空引用。

    错误示例

    int& badFunction() {int localVar = 10;return localVar;  // 错误:返回局部变量的引用
    }
    

1.4 引用的其他特性

1.4.1 常量引用(const 引用)

常量引用是指向常量的引用,不能通过常量引用修改所引用的对象。常量引用可以绑定到临时对象和字面量,这在函数参数传递中非常有用,以提高效率和灵活性。

示例:常量引用

#include <iostream>void printValue(const int &val) {// val = 100;  // 错误:不能通过常量引用修改值std::cout << "Value: " << val << std::endl;
}int main() {int a = 42;printValue(a);        // 传递变量printValue(100);      // 传递字面量printValue(a + 10);   // 传递表达式结果(临时对象)return 0;
}

解释

  • const int &val 是一个常量引用,可以绑定到变量、字面量或临时对象。

  • 通过常量引用,可以避免不必要的拷贝,同时保证不修改原始数据。

1.4.2 引用与函数重载

引用可以用于函数重载,区分传值和传引用的函数。

示例:引用与函数重载

#include <iostream>void func(int x) {std::cout << "func(int): " << x << std::endl;
}void func(int &x) {std::cout << "func(int&): " << x << std::endl;
}int main() {int a = 5;func(a);    // 调用 func(int&)func(10);   // 调用 func(int)return 0;
}

解释

  • 当传递变量 a 时,优先调用 func(int&)

  • 当传递字面量 10 时,只能调用 func(int),因为字面量不能绑定到非 const 引用。


2. 指针(Pointers)

2.1 什么是指针?

指针是一个变量,其值为另一个变量的内存地址。通过指针,可以间接访问和操作所指向的变量。

特点

  • 指针可以指向不同的对象,甚至可以不指向任何对象(即可以为 nullptr)。

  • 指针本身需要存储所指向对象的内存地址,因此占用一定的内存空间。

  • 指针提供了更大的灵活性,但也带来了更高的复杂性和潜在的不安全性。

2.2 指针的基本语法

type *指针名;

示例:基本指针

#include <iostream>int main() {int a = 10;int *ptr = &a;  // ptr 是一个指向 int 类型的指针,存储 a 的地址std::cout << "a = " << a << ", *ptr = " << *ptr << std::endl;  // 输出: a = 10, *ptr = 10*ptr = 20;  // 通过指针修改 a 的值std::cout << "a = " << a << ", *ptr = " << *ptr << std::endl;  // 输出: a = 20, *ptr = 20return 0;
}

解释

  • int *ptr = &a; 声明了一个指向 int 类型的指针 ptr,并将其初始化为变量 a 的地址。

  • *ptr 是解引用操作,访问指针所指向的值。

  • 通过指针 ptr 修改 *ptr 实际上就是修改 a 的值。

2.3 指针的用途

2.3.1 动态内存管理

指针广泛用于动态内存分配和释放,允许在运行时根据需要分配和释放内存。

示例:使用 newdelete

#include <iostream>int main() {int *ptr = new int;  // 动态分配一个 int 大小的内存*ptr = 42;std::cout << "Dynamic value: " << *ptr << std::endl;  // 输出: 42delete ptr;  // 释放动态分配的内存ptr = nullptr;  // 将指针置为 nullptr,避免悬空指针return 0;
}

解释

  • new int 在堆上分配一个 int 大小的内存,并返回其地址,赋值给指针 ptr

  • *ptr = 42; 向分配的内存写入值 42

  • delete ptr; 释放分配的内存,防止内存泄漏。

  • 将指针置为 nullptr 是一个良好的习惯,避免后续误用悬空指针。

2.3.2 数组和指针

指针与数组密切相关,数组名在很多情况下可以视为指向数组首元素的指针。

示例:指针与数组

#include <iostream>int main() {int arr[] = {1, 2, 3, 4, 5};int *ptr = arr;  // ptr 指向数组的第一个元素for(int i = 0; i < 5; ++i) {std::cout << "arr[" << i << "] = " << *(ptr + i) << std::endl;}return 0;
}

解释

  • int *ptr = arr; 数组名 arr 在此上下文中被视为指向数组第一个元素的指针。

  • *(ptr + i) 访问数组的第 i 个元素,等同于 arr[i]

2.3.3 函数参数传递(指针传参)

指针常用于函数参数传递,以允许函数修改调用者的变量,或者传递大型对象以避免拷贝。

示例:通过指针修改函数外部的变量

#include <iostream>// 通过指针传参,函数内部可以修改调用者的变量
void increment(int *num) {if (num) {  // 检查指针是否为 nullptr(*num)++;}
}int main() {int value = 5;std::cout << "Before increment: " << value << std::endl;  // 输出: 5increment(&value);std::cout << "After increment: " << value << std::endl;   // 输出: 6return 0;
}

解释

  • void increment(int *num) 函数参数 num 是一个指向 int 的指针。

  • 在函数内部通过解引用指针 *num 来修改调用者的变量 value

  • 调用时使用 &value 传递 value 的地址。

2.4 指针的其他特性

2.4.1 指针运算

指针支持算术运算,如递增、递减、加减整数等,通常用于遍历数组或动态分配的内存块。

示例:指针运算

#include <iostream>int main() {int arr[] = {10, 20, 30, 40, 50};int *ptr = arr;  // 指向数组的第一个元素for(int i = 0; i < 5; ++i) {std::cout << "Element " << i << ": " << *ptr << std::endl;ptr++;  // 移动到下一个元素}return 0;
}

解释

  • ptr++ 将指针移动到下一个 int 元素的位置,相当于 ptr = ptr + 1;

  • 指针运算的步长取决于指针所指向的类型大小。

2.4.2 指针与引用对比

特性引用指针
定义与初始化必须在声明时初始化,且不能重新绑定可以在声明时不初始化,可以重新赋值
是否可为空不能为 null,必须引用有效对象可以为 nullptr,表示不指向任何对象
语法使用使用 & 声明引用,通过引用名直接访问使用 * 声明指针,通过 * 解引用访问
重新绑定不能重新绑定到其他对象可以重新指向其他对象
内存地址操作不支持指针运算,不能进行地址算术支持指针运算,可以进行地址算术
安全性更安全,不易出现悬空引用较不安全,容易出现悬空指针和野指针
函数参数传递通常用于传递别名,避免拷贝,允许修改通常用于传递地址,允许修改,灵活但复杂
多级引用/指针不支持多级引用(如引用的引用)支持多级指针(如指针的指针)

2.5 指针的高级用法

2.5.1 指针的指针(多级指针)

指针可以指向另一个指针,形成多级指针,常用于动态多维数组或复杂的数据结构。

示例:指针的指针

#include <iostream>int main() {int a = 10;int *ptr = &a;int **pptr = &ptr;  // pptr 指向指针 ptrstd::cout << "a = " << a << std::endl;std::cout << "*ptr = " << *ptr << std::endl;std::cout << "**pptr = " << **pptr << std::endl;**pptr = 20;  // 通过多级指针修改 a 的值std::cout << "After modification: a = " << a << std::endl;return 0;
}

解释

  • int **pptr = &ptr; 声明了一个指向指针 ptr 的指针 pptr

  • **pptr 通过两级解引用访问变量 a 的值。

  • 通过 **pptr = 20; 修改 a 的值。

2.5.2 动态内存分配(堆内存)

指针广泛用于动态内存管理,允许在运行时根据需求分配和释放内存,适用于需要灵活内存使用的场景,如动态数组、复杂数据结构等。

示例:动态分配数组

#include <iostream>int main() {int size = 5;int *arr = new int[size];  // 动态分配一个包含 size 个 int 的数组for(int i = 0; i < size; ++i) {arr[i] = i + 1;}for(int i = 0; i < size; ++i) {std::cout << "arr[" << i << "] = " << arr[i] << std::endl;}delete[] arr;  // 释放动态分配的数组内存arr = nullptr;return 0;
}

解释

  • new int[size] 在堆上动态分配一个包含 sizeint 元素的数组,并返回指向数组首元素的指针。

  • 使用 delete[] arr; 释放动态分配的数组内存,防止内存泄漏。

  • 将指针置为 nullptr 是一个良好的习惯,避免后续误用悬空指针。


3. 引用与指针的区别总结

特性引用指针
定义与初始化必须在声明时初始化,且不能重新绑定可以在声明时不初始化,可以重新赋值
是否可为空不能为 null,必须引用有效对象可以为 nullptr,表示不指向任何对象
语法使用使用 & 声明引用,通过引用名直接访问使用 * 声明指针,通过 * 解引用访问
重新绑定不能重新绑定到其他对象可以重新指向其他对象
内存地址操作不支持指针运算,不能进行地址算术支持指针运算,可以进行地址算术
安全性更安全,不易出现悬空引用较不安全,容易出现悬空指针和野指针
函数参数传递通常用于传递别名,避免拷贝,允许修改通常用于传递地址,允许修改,灵活但复杂
多级引用/指针不支持多级引用(如引用的引用)支持多级指针(如指针的指针)
使用场景函数参数传递、返回引用、简化代码动态内存管理、复杂数据结构、底层编程

3.1 何时使用引用,何时使用指针?

  • 使用引用

    • 当需要为变量提供别名,简化代码,且不需要重新绑定时。

    • 在函数参数传递中,希望避免拷贝大对象,同时允许函数修改调用者的变量。

    • 当需要返回一个对象的引用,且确保返回的引用始终有效时。

    • 一般情况下,引用更安全、更简洁,优先考虑使用引用。

  • 使用指针

    • 当需要动态内存管理(如使用 newdelete)时。

    • 当需要指向不同的对象,或在运行时决定指向哪个对象时。

    • 当需要支持多级间接访问(如指针的指针)时。

    • 当需要与底层系统编程、硬件交互或处理复杂数据结构(如链表、树等)时。

    • 指针提供了更大的灵活性,但也带来了更高的复杂性和潜在的不安全性,使用时需谨慎。


4. 引用与指针的实际应用示例

4.1 使用引用简化代码

示例:交换两个变量的值(使用引用)

#include <iostream>void swap(int &a, int &b) {int temp = a;a = b;b = temp;
}int main() {int x = 5, y = 10;std::cout << "Before swap: x = " << x << ", y = " << y << std::endl;swap(x, y);std::cout << "After swap: x = " << x << ", y = " << y << std::endl;return 0;
}

解释

  • 通过引用传参,函数内部直接操作调用者的变量,无需使用指针,代码更简洁。

4.2 使用指针进行动态内存管理

示例:动态分配和释放内存

#include <iostream>int main() {int size;std::cout << "Enter the size of the array: ";std::cin >> size;int *arr = new int[size];  // 动态分配数组for(int i = 0; i < size; ++i) {arr[i] = i * 10;}std::cout << "Array elements: ";for(int i = 0; i < size; ++i) {std::cout << arr[i] << " ";}std::cout << std::endl;delete[] arr;  // 释放动态分配的数组内存arr = nullptr;return 0;
}

解释

  • 用户输入数组大小,程序动态分配相应大小的数组。

  • 使用指针 arr 访问和操作动态分配的内存。

  • 使用 delete[] arr; 释放内存,防止内存泄漏。

4.3 使用常量引用提高函数效率

示例:传递大型对象(如 std::string)通过常量引用

#include <iostream>
#include <string>// 通过常量引用传参,避免拷贝大型对象
void printString(const std::string &str) {std::cout << "String: " << str << std::endl;
}int main() {std::string message = "Hello, C++!";printString(message);  // 传递字符串,避免拷贝return 0;
}

解释

  • 通过常量引用 const std::string &str 传参,避免了复制整个 std::string 对象,提高了效率,同时保证不修改原始字符串。


5. 总结

引用和指针是 C++ 中用于间接访问变量的两种重要机制,各有其独特的特性和适用场景。

  • 引用

    • 提供变量的别名,语法简洁,使用安全。

    • 必须在声明时初始化,且不能重新绑定或为 null。

    • 常用于函数参数传递、返回引用和简化代码。

    • 更加安全和直观,推荐在大多数情况下优先使用。

  • 指针

    • 存储变量的内存地址,提供更大的灵活性和控制。

    • 可以指向不同的对象,可以为 null,支持指针运算。

    • 常用于动态内存管理、复杂数据结构和底层编程。

    • 使用时需谨慎,避免悬空指针和内存泄漏。

理解引用和指针的区别与联系,根据具体需求选择合适的工具,是编写高效、安全、可维护的 C++ 程序的关键。在实际编程中,引用和指针常常结合使用,发挥各自的优势,实现复杂的功能和优化性能。

 

指针(Pointer)与引用(Reference)的区别、使用场景、示例及注意事项

在 C++ 中,指针(pointer)引用(reference) 都是用于间接访问变量的机制,但它们在使用方式、灵活性和语义上存在显著差异。下面从多个方面进行详细对比。


一、基本概念

1. 指针(Pointer)

  • 是一个变量,其值为另一个变量的内存地址

  • 可以指向不同的对象,也可以为 nullptr(即不指向任何对象)。

  • 支持指针运算(如加减、比较等)。

  • 使用 * 来声明和解引用。

2. 引用(Reference)

  • 是某个已存在变量的别名(alias),即给变量起了一个新名字。

  • 必须在定义时初始化,且一旦绑定到一个对象后,不能再绑定到其他对象

  • 不可以为空(不能为“null”)。

  • 通常不支持引用运算(如引用加减)。

  • 使用 & 来声明。


二、主要区别

特性指针(Pointer)引用(Reference)
是否必须初始化否(但建议初始化)必须初始化
是否可以重新绑定可以指向不同对象不可重新绑定,始终指向初始化的对象
是否可以为 null可以为 nullptr不能为 null
是否支持运算支持(如 p++, p + n不支持运算
访问方式使用 * 解引用直接使用,无需解引用
内存占用占用存储空间(保存地址)通常是别名,一般不占用额外空间(编译器实现相关)
语法复杂度较复杂,需注意解引用和空指针较简单,更直观

三、使用场景

指针的典型使用场景:

  1. 动态内存分配:如使用 new / deletemalloc / free

  2. 需要指向不同对象或可重新绑定:例如遍历数组、链表节点操作等。

  3. 可选参数(可为 null):函数参数可传入 nullptr 表示“无值”。

  4. 底层操作、硬件访问、C 兼容接口

  5. 实现数据结构(如链表、树等)

引用的典型使用场景:

  1. 函数参数传递(避免拷贝,且必须传入对象):常用作“输入参数”或“输出参数”。

  2. 函数返回值优化(如返回引用避免拷贝)

  3. 运算符重载(如 operator=、流操作符 <<>>

  4. 简化代码,提高可读性(不需要解引用)

  5. 必须绑定对象且不为空的场景


四、代码示例

示例 1:基本用法对比

#include <iostream>
using namespace std;int main() {int a = 10;// 指针int* p = &a;   // p 是一个指针,指向 a 的地址cout << "通过指针访问: " << *p << endl;  // 解引用*p = 20;       // 通过指针修改 a 的值cout << "修改后 a = " << a << endl;// 引用int& r = a;    // r 是 a 的引用(别名)cout << "通过引用访问: " << r << endl;r = 30;        // 通过引用修改 a 的值cout << "修改后 a = " << a << endl;return 0;
}

输出:

通过指针访问: 10
修改后 a = 20
通过引用访问: 20
修改后 a = 30

示例 2:函数参数传递(引用 vs 指针)

#include <iostream>
using namespace std;// 通过指针修改值
void modifyByPointer(int* p) {if (p) // 必须检查是否为空*p = 100;
}// 通过引用修改值
void modifyByReference(int& r) {r = 200; // 无需检查 null,引用不能为空
}int main() {int x = 10;modifyByPointer(&x);cout << "通过指针修改后 x = " << x << endl;  // 100modifyByReference(x);cout << "通过引用修改后 x = " << x << endl;  // 200return 0;
}

说明:

  • 指针作为参数时,调用方需要显式取地址(&x),函数内需检查是否为 nullptr

  • 引用作为参数时,更简洁安全,调用方直接传值,函数内无需解引用或判空。


五、注意事项

指针注意事项:

  1. 空指针风险:访问 nullptr 会导致程序崩溃,需谨慎判断。

  2. 野指针:指向已释放内存的指针非常危险,应避免。

  3. 悬挂指针:指向的对象被销毁后,指针未置空。

  4. 类型安全:指针类型要匹配,避免非法类型转换和操作。

  5. 指针运算要小心:比如数组越界等。

引用注意事项:

  1. 必须初始化:未初始化的引用是非法的(编译错误)。

  2. 不可重新绑定:一旦初始化绑定某对象,之后不能再引用其它对象。

  3. 不能为 null:无法像指针那样表示“无对象”的状态,因此不适合用作可选参数。

  4. 底层仍是指针实现:虽然语法上是别名,但编译器可能通过指针实现引用。

  5. 引用作为返回值时要注意生命周期:不能返回局部变量的引用!


六、总结推荐

目的推荐使用
函数参数传递,希望避免拷贝,且确保对象一定存在引用 ✅ 更安全、简洁
需要表示“可能为空”的参数或对象指针 ✅ 可以使用 nullptr
动态内存管理(new/delete)指针 ✅ 必须使用
实现数据结构(如链表、树节点)指针 ✅ 常用
运算符重载(如 =, <<, >>)引用 ✅ 更自然
需要重新绑定指向不同对象指针 ✅ 引用不行

七、附加建议

  • 在现代 C++ 中,推荐优先使用 引用,必要时使用 智能指针(如 std::unique_ptr, std::shared_ptr 代替裸指针,以提高安全性。

  • 尽量避免使用裸指针进行资源管理,以减少内存泄漏和悬空指针的风险。


好的,我们继续深入探讨 指针与引用 的更多细节,包括:

  1. 指针与引用在类和对象中的使用

  2. 返回引用的注意事项与陷阱

  3. 指针与引用在函数返回时的应用

  4. 智能指针简介(对比裸指针)

  5. 更多代码示例与常见误区

  6. 总结与选择建议


一、指针与引用在类和对象中的使用

1. 类成员函数中的引用参数

引用常用于类的成员函数中,避免对象拷贝,提高效率,尤其是对于大型对象。

class Person {
public:std::string name;int age;// 使用引用作为参数,避免拷贝void printInfo(const std::string& prefix) const {std::cout << prefix << ": Name = " << name << ", Age = " << age << std::endl;}
};

2. 返回对象引用

常见于类的成员函数返回自身引用,以实现链式调用(如 setter 方法)。

class Counter {int count = 0;
public:Counter& increment() {++count;return *this; // 返回当前对象的引用,支持链式调用}int getCount() const { return count; }
};int main() {Counter c;c.increment().increment().increment();std::cout << "Count = " << c.getCount() << std::endl; // 输出 3
}

🔒 注意:不要返回局部变量的引用!

❌ 错误示例:

int& badFunction() {int x = 10;return x; // x 是局部变量,函数结束后被销毁,返回的引用无效!
}

调用上述函数并使用返回的引用是未定义行为(UB),可能导致程序崩溃或数据错误。


二、返回引用的注意事项与陷阱

✅ 合法情况:

  • 返回 静态局部变量 的引用(生命周期持续到程序结束)

  • 返回 类成员变量 的引用(对象存活期间有效)

  • 返回 传入参数的引用

  • 返回 全局变量 的引用

❌ 非法/危险情况:

  • 返回 局部变量 的引用(函数结束,变量被销毁)

  • 返回 临时对象 的引用

✅ 合法示例:

const std::string& getDefaultName() {static std::string defaultName = "Unknown";return defaultName; // 静态变量,生命周期长
}

三、指针与引用在函数返回中的应用

1. 返回指针

适用于返回动态分配的对象,或者需要表示“可能为空”的情况。

int* createInt(int value) {int* p = new int(value);return p; // 调用者需要记得 delete
}

⚠️ 注意:使用裸指针返回堆对象时,调用者必须手动管理内存(delete),否则会造成内存泄漏。

推荐使用 智能指针(见下文)来避免此问题。

2. 返回引用

适用于返回已有对象的别名,如成员变量、静态变量等。

class Config {int timeout = 30;
public:int& getTimeout() { return timeout; // 返回成员变量的引用,外部可以修改}
};

四、智能指针简介(现代 C++ 推荐)

C++11 引入了智能指针,用于自动管理动态内存,避免手动 new/delete 带来的风险。

常见智能指针:

智能指针用途是否独占所有权
std::unique_ptr<T>独占资源,不可复制,可移动✅ 是
std::shared_ptr<T>多个指针共享同一对象,引用计数❌ 否
std::weak_ptr<T>配合 shared_ptr 使用,解决循环引用-

示例:使用 std::unique_ptr

#include <memory>
#include <iostream>std::unique_ptr<int> createUniqueInt(int value) {return std::make_unique<int>(value); // 自动管理内存
}int main() {auto ptr = createUniqueInt(42);std::cout << *ptr << std::endl; // 42// 不需要手动 delete,超出作用域自动释放
}

🔒 推荐:在现代 C++ 中优先使用智能指针而非裸指针,除非有特殊需求(如底层 API、性能极度敏感场景)。


五、更多代码示例与常见误区

误区 1:函数返回局部变量的引用或指针

int& getLocalRef() {int x = 100;return x; // 错误:x 是局部变量
}int* getLocalPtr() {int y = 200;return &y; // 错误:y 是局部变量
}

🔴 这两个函数返回的引用/指针都会指向已经被销毁的栈内存,属于未定义行为(Undefined Behavior)


误区 2:混淆指针与引用的用途

想实现的功能推荐使用
参数可能为空指针 ✅
参数不能为空,希望简化语法引用 ✅
需要改变指针本身(比如指向别的对象)指针 ✅
实现链式调用(如 builder 模式)引用 ✅(返回 *this)
动态创建对象并由函数返回智能指针 ✅ 或 裸指针(需调用者管理)

六、总结与选择建议

场景推荐使用原因
函数参数传递,避免拷贝,对象必须存在引用更安全、简洁,无需判空
可选参数(可能为空)指针可以传递 nullptr 表示无值
动态内存分配(new / delete)指针(或更推荐 智能指针引用无法指向动态分配的对象本身
实现链式调用(如 obj.setX().setY()引用(返回 *this语法自然,易于理解
底层操作、硬件访问、与 C 接口交互指针引用不具备指针的灵活性
作为函数返回值,返回对象本身或成员引用(确保对象存活)更高效,避免拷贝
作为函数返回值,可能失败或为空指针特殊返回值/异常引用不能为 null

七、终极建议(C++最佳实践)

  1. 优先使用引用:在函数参数、返回值中,如果对象必须存在,优先使用引用,代码更清晰安全。

  2. 谨慎使用指针:仅在需要表示可选性(可能为空)、动态内存管理、底层操作时使用指针。

  3. 避免返回局部变量的引用/指针:这是常见错误,务必确保返回的引用/指针指向有效的、生命周期足够长的对象。

  4. 使用智能指针替代裸指针管理资源:如 std::unique_ptr, std::shared_ptr,提高代码安全性,防止内存泄漏。

  5. 理解它们的底层机制:虽然引用用起来像别名,但通常由编译器通过指针实现;理解这一点有助于深入掌握 C++。


 

http://www.dtcms.com/a/509331.html

相关文章:

  • c语言常量指针和指针常量
  • 网站注销备案查询系统网站建设,h5,小程序
  • 做a小视频网站知名商业网站有哪些
  • 网站标准尺寸一家专门做特卖的网站是什么
  • 网站做有偿广告需要什么有序济南网站建设手机
  • STM32 AFIO时钟什么情况需要开启?
  • 国外比较好的建筑设计网站莱芜做网站公司
  • 整站seo技术搜索引擎优化南充市房地产网官方网站
  • 最新PHP代码加密系统V1.0
  • 公司网站域名如何备案wordpress评论邮件插件
  • 室内设计网站有哪些知乎辽宁丹东建设工程信息网站
  • Java进销存ERP管理系统源码
  • PK confluence,一款国产开源免费的知识库管理工具 - sward,极致轻量简洁
  • 网站建设 6万情女照片做杯子网站
  • 有谁帮做网站网站建设面包屑导航条
  • 网站设置cookie什么意思微信公众号平台小程序登录入口
  • 医院管理系统网站模板wordpress仿站步奏
  • ROS2工具之坐标变换TF !!!!!
  • 用最少的钱做网站邢台手机网站建设信息
  • 网站建设公司的公司排名郑州微网站开发
  • 山姆·奥特曼如何玩转好莱坞
  • 长沙网站建设哪个好网站项目下载
  • 济南做网站公司哪家好wordpress登录404
  • 【推荐100个unity插件】动态的、无需烘焙的遮挡剔除方案——SECTR World Streaming for Unity 6
  • commons-text
  • 网站建设课程报告设置WordPress文章图片
  • 网站开发技术有什么软件江门专业网站建设公司
  • 不备案 网站 盈利蒙古文网站建设
  • 佛山网站建设过程贵州灵溪seo整站优化
  • 网站开发费分摊多少年免费空间设立网站