0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中const以及this指针的使用

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-09-23 11:39 次阅读

const

作用

修饰变量,说明该变量不可以被改变;

修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);

修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;

修饰成员函数,说明该成员函数内不能修改成员变量。

const 的指针与引用

指针

指向常量的指针(pointer to const)

自身是常量的指针(常量指针,const pointer)

引用

指向常量的引用(reference to const)

没有 const reference,因为引用只是对象的别名,引用不是对象,不能用 const 修饰

(为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3

const 使用

// 类class A{private: const int a; // 常对象成员,可以使用初始化列表或者类内初始化 public: // 构造函数 A() : a(0) { }; A(int x) : a(x) { }; // 初始化列表 // const可用于对重载函数的区分

int getValue(); // 普通成员函数 int getValue() const; // 常成员函数,不得修改类中的任何数据成员的值

}; void function(){ // 对象 A b; // 普通对象,可以调用全部成员函数 const A a; // 常对象,只能调用常成员函数 const A *p = &a; // 指针变量,指向常对象 const A &q = a; // 指向常对象的引用 // 指针 char greeting[] = “Hello”; char* p1 = greeting; // 指针变量,指向字符数组变量

const char* p2 = greeting; // 指针变量,指向字符数组常量(const 后面是 char,说明指向的字符(char)不可改变) char* const p3 = greeting; // 自身是常量的指针,指向字符数组变量(const 后面是 p3,说明 p3 指针自身不可改变) const char* const p4 = greeting; // 自身是常量的指针,指向字符数组常量

} // 函数void function1(const int Var); // 传递过来的参数在函数内不可变void function2(const char* Var); // 参数指针所指内容为常量void function3(char* const Var); // 参数指针为常量void function4(const int& Var); // 引用参数在函数内为常量 // 函数返回值

const int function5(); // 返回一个常数const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6();int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7();

static

作用

修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。

修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。

修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。

修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。

this 指针

this 指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向调用该成员函数的那个对象。

当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。

当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。

this 指针被隐含地声明为: ClassName *const this,这意味着不能给 this 指针赋值;在 ClassName 类的 const 成员函数中,this 指针的类型为:const ClassName* const,这说明不能对 this 指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);

this 并不是一个常规变量,而是个右值,所以不能取得 this 的地址(不能 &this)。

在以下场景中,经常需要显式引用 this 指针:

为实现对象的链式引用;

为避免对同一对象进行赋值操作;

在实现一些数据结构时,如 list。

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128790
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92406
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310

原文标题:C++基础语法梳理:const,static以及 this 指针

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数组与指针不能混用的情况

    数组与指针不能混用的情况  数组与指针是 C/C++ 中非常常见的特性和概念。然而,在某些情况下,数组与指针是不能混用的。这种情况通常涉及到数组的内存分配和数组的块拷贝。 首先,让我们
    的头像 发表于 12-07 13:46 316次阅读

    C++智能指针的底层实现原理

    C++智能指针的头文件: #include 1. shared_ptr: 智能指针从本质上来说是一个模板类,用类实现对指针对象的管理。 template class shared_pt
    的头像 发表于 11-09 14:32 296次阅读
    <b class='flag-5'>C++</b>智能<b class='flag-5'>指针</b>的底层实现原理

    C++程序设计精简版

    指针第 7 章 自定义数据类型 第 3 篇 基于对象的程序设计第 8 章 类和对象第 9 章 关于类和对象的进一步讨论第 10 章 运算符重载 第 4 篇 面向对象的程序设计第 11 章 继承与派生第 12 章 多态性与虚函数第 13 章 输入输出流第 14 章 C++
    发表于 10-09 07:26

    嵌入式C/C++语言精华文章集锦

    /C++编程,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。 经验不足的开发人员往往将所有需要传送的内容依顺序保存在 char 型数组,通过
    发表于 09-25 08:00

    C51的函数指针

    函数指针C编程语言的许多困难特性之一。 由于C编译器对8051体系结构的独特要求,函数指针和可重入函数面临着更大的挑战。 这主要是由于传递函数参数的方式所致。 通常,(对于除8051
    发表于 09-04 08:29

    C++函数指针和回调函数详解

    指针是一个变量,是用来指向内存地址。
    发表于 08-21 15:07 144次阅读
    <b class='flag-5'>C++</b>函数<b class='flag-5'>指针</b>和回调函数详解

    C语言中指针数组和数组指针的区别

    指针和数组之间存在着紧密的关系。在本文中,我们将探讨指针和数组的关系、指针算术和数组遍历、多维数组与指针以及
    发表于 08-17 15:29 280次阅读

    C++演示的推理速度比Python演示的推理速度更快是为什么?

    在同一主机机上采用相同型号的 Ran Object Detection C++ 演示 和 对象检测 Python 演示 。 C++ 演示的推理速度比 Python 演示的推理速度
    发表于 08-15 06:52

    如何为Arm编译Cc++代码

    Studio或Keil MDK IDE环境。 Linux编译常见的编程语言在Arm上得到了很好的支持,大多数开源工具都可以在Linux发行版提供的包中使用。用于C++C和Fortran的商业编译器可从
    发表于 08-02 17:28

    一起探索C++的世界!

    C++
    YS YYDS
    发布于 :2023年07月07日 19:10:25

    C语言const关键字的用法

    const是constant的简写,用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。
    发表于 06-29 09:51 347次阅读

    浅谈C/C++里的指针

    指针是C和C++中的难点和重点。指针是C的灵魂。我不想重复大多数书上说得很清楚的东西,只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来。目的是:1、通过写这些东西,把我脑袋中关于C的模糊的知识清晰化。
    发表于 06-28 10:21 303次阅读

    const指针变量使用

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定
    的头像 发表于 06-22 10:43 322次阅读

    const关键字应用总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性
    的头像 发表于 05-26 09:06 368次阅读

    C语言|const关键字介绍

    最近看别人的项目, 发现const使用比较多, 通过使用const来保护变量, 这篇推文就来简单回顾一下相关知识!
    的头像 发表于 05-25 15:11 364次阅读