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

程序代码篇---C++常量引用


文章目录

  • 前言
  • 第一部分:C++常量
    • 常量变量
    • const与指针
      • 1.指向常量的指针
      • 2.常量指针
      • 3.指向常量的常量指针
    • 常量成员函数
    • const_cast运算符
    • 总结
  • 第二部分:C++引用
    • 引用的基本概念
    • 引用的声明
    • 引用的使用
    • 引用的特性
      • 1.不可变性
      • 2.无需解引用
      • 3.内存地址
    • 引用的用途
      • 1.函数参数传递
      • 2.函数的返回值
    • 引用的限制
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了C++中的const常量、&引用。


第一部分:C++常量

在C++中,const关键字用于声明变量为常量,即其值在初始化后不能被修改。const可以用于多种上下文中,包括变量、函数、成员函数和指针。以下是关于C++中const的详细解释:

常量变量

使用const声明的变量必须在声明时或构造时初始化,之后其值不能被改变。

const int MAX_SIZE = 100; // 声明并初始化一个常量
// MAX_SIZE = 200; // 错误:不能修改常量的值

const与指针

C++中,const可以与指针一起使用,有以下几种情况:

1.指向常量的指针

指向常量的指针(Pointer to Constant): 指针指向的数据是常量,不能通过指针修改数据,但指针本身可以指向其他地址。

int value = 10;
const int* ptr = &value; // ptr指向一个int类型的常量
// *ptr = 20; // 错误:不能通过ptr修改值
ptr = &another_value; // 正确:可以改变ptr指向的地址

2.常量指针

常量指针(Constant Pointer): 指针本身是常量,一旦初始化,指针的地址不能改变,但可以通过指针修改指向的数据。

int value = 10;
int another_value = 20;
int* const ptr = &value; // ptr是一个指向int的常量指针
*ptr = 20; // 正确:可以通过ptr修改value的值
// ptr = &another_value; // 错误:不能改变ptr指向的地址

3.指向常量的常量指针

指向常量的常量指针(Constant Pointer to Constant): 指针本身和它指向的数据都是常量,都不能被修改。

int value = 10;
const int* const ptr = &value; // ptr是一个指向int类型常量的常量指针
// *ptr = 20; // 错误:不能通过ptr修改值
// ptr = &another_value; // 错误:不能改变ptr指向的地址

常量成员函数

在类中,可以使用const关键字声明成员函数,表示该函数不会修改类的任何非静态成员变量

class MyClass {
public:
    void modify() { /* 可以修改成员变量 */ }
    void display() const { /* 不能修改成员变量 */ }
};

如果成员函数被声明为const,则在函数体内不能修改成员变量也不能调用非const成员函数

const_cast运算符

const_cast是C++中用于类型转换的运算符之一,它可以用来添加或移除const属性。

const int a = 10;
int* b = const_cast<int*>(&a); // 移除a的const属性
*b = 20; // 现在可以通过b修改a的值,但这通常是不安全的做法

需要注意的是,使用const_cast去除const属性是一种未定义行为,除非原始对象不是const,或者在修改后没有再次通过const引用或指针访问它。

总结

const在C++中用于声明不应该被修改的变量、指针和成员函数。正确使用const可以提高代码的可读性和安全性,因为它清楚地告诉编译器和程序员哪些数据是不应该被改变的。此外,const还可以帮助编译器进行优化,因为它提供了更多的信息关于变量的使用方式。

第二部分:C++引用

在C++中,引用是一种特殊的语法,它为已存在的变量提供了一个别名。引用在很多方面与指针类似,但它们的使用方式和语义有所不同。以下是关于C++中引用的详细解释:

引用的基本概念

  1. 引用是另一个变量的别名它在声明时必须被初始化,并且一旦初始化,就不能再成为其他变量的引用。
  2. 引用不是对象,它只是为一个已存在的对象提供了一个额外的名字。
  3. 引用必须在声明时进行初始化,且不能重新绑定到另一个对象。

引用的声明

引用的声明使用&符号,如下所示:

int var = 10;
int& ref = var; // ref是var的引用

在这个例子中,ref是var的引用,它们共享相同的内存地址和数据

引用的使用

引用在很多情况下可以像普通变量一样使用:

可以通过引用来读取和修改所引用的变量的值
引用可以传递给函数,允许函数直接修改调用者的变量

void modify(int& r) {
    r = 20; // 修改引用所绑定的变量
}

int main() {
    int var = 10;
    int& ref = var;
    modify(ref); // 通过引用传递变量
    // 现在 var 的值是 20
    return 0;
}

引用的特性

1.不可变性

不可变性:一旦引用被初始化,它就不能被重新绑定到另一个对象

2.无需解引用

无需解引用:与指针不同,引用不需要使用*来访问所引用的值

3.内存地址

内存地址:引用与所引用的变量共享相同的内存地址

int var = 10;
int& ref = var;
cout << &var << " " << &ref; // 输出相同的地址

引用的用途

1.函数参数传递

函数参数传递:使用引用可以避免复制大的对象,提高函数调用的效率。(直接操作地址)

2.函数的返回值

函数返回值:可以使用引用作为函数的返回值,允许函数返回一个变量而不是变量的副本

int& getVar() {
    static int var = 10;
    return var; // 返回局部静态变量的引用
}

int main() {
    int& ref = getVar();
    ref = 20; // 修改通过引用返回的变量
    return 0;
}

引用的限制

  1. 引用必须在声明时初始化。
  2. 不能有引用的数组(例如,int& arr[10];是非法的)。
  3. 不能有指向引用的指针(例如,int&* p;是非法的)。
  4. 悬挂引用:如果引用了一个临时对象或者局部变量,并且该对象在引用之后被销毁,那么引用将成为悬挂引用,这会导致未定义行为。
int& getRef() {
    int var = 10; // 局部变量
    return var; // 返回局部变量的引用,这是危险的!
}

int main() {
    int& ref = getRef(); // 悬挂引用
    // 使用ref可能导致未定义行为
    return 0;
}

在上述代码中,getRef函数返回局部变量的引用,这是一个非常糟糕的做法,因为它会在函数返回后留下一个悬挂引用

总结来说,引用是C++中一个非常强大的特性,它提供了方便的语法和高效的性能,但同时也需要谨慎使用,以避免悬挂引用和其他潜在的问题。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了C++中的const常量、&引用。


http://www.kler.cn/a/523331.html

相关文章:

  • C语言练习(29)
  • Kiwi 安卓浏览器本月停止维护,扩展功能迁移至 Edge Canary
  • Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin
  • wow-agent---task4 MetaGPT初体验
  • 危机13小时:追踪一场GitHub投毒事件
  • 小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)
  • Dest1ny漏洞库:中科网威 anysec 安全网关 arping 存在后台远程命令执行漏洞
  • [A-29]ARMv8/v9-GIC-中断子系统的安全架构设计(Security/FIQ/IRQ)
  • Python 数据分析 - Matplotlib 绘图
  • 第29篇:Python开发进阶:数据库操作与ORM
  • 实战纪实 | 真实HW漏洞流量告警分析
  • MLMs之Janus:Janus/Janus-Pro的简介、安装和使用方法、案例应用
  • 《网络数据安全管理条例》施行,企业如何推进未成年人个人信息保护(下)
  • UE求职Demo开发日志#8 强化前置条件完善,给物品加图标
  • 数据从前端传到后端入库过程分析
  • 【汽车电子架构】AutoSAR从放弃到入门专栏导读
  • 【2024年华为OD机试】 (C卷,200分)- 根据IP查找城市(JavaScriptJava PythonC/C++)
  • 股指期货的基差套利有什么样的风险?
  • 【后端开发】字节跳动青训营Cloudwego脚手架
  • DeepSeek 突然崛起的原因剖析及对外界的影响
  • 【MySQL】悲观锁和乐观锁的原理和应用场景
  • C基础寒假练习(3)
  • 基础IO相关知识
  • 使用jmeter进行压力测试
  • 安全漏洞扫描与修复系统的高质量技术详解
  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-LangGraph-链式处理(一)