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

    文章

    7588

    浏览量

    135736
  • 编程
    +关注

    关注

    88

    文章

    3556

    浏览量

    93519
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62290

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

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

收藏 人收藏

    评论

    相关推荐

    C语言和C++结构体的区别

    同样是结构体,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 70次阅读

    C语言指针运算符详解

    C语言中,当你有一个指向数组某个元素的指针时,你可以对该指针执行某些算术运算,例如加法或减法。这些运算可以用来遍历数组的元素,如ptr
    的头像 发表于 10-30 11:16 94次阅读

    ostream在c++的用法

    ostream 是 C++ 标准库中一个非常重要的类,它位于 头文件(实际上,更常见的是通过包含 头文件来间接包含 ,因为 包含了 和 )。 ostream 类及其派生类(如 std::cout
    的头像 发表于 09-20 15:11 366次阅读

    C++实现类似instanceof的方法

    函数,可实际上C++没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java的instanceof的功能。 在 C++
    的头像 发表于 07-18 10:16 475次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>实现类似instanceof的方法

    Keil+C51对双数据指针的直接利用

    Keil+C51对双数据指针的直接利用
    发表于 06-18 10:15 0次下载

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客,我们将仔细研究以 C++
    的头像 发表于 03-28 13:53 690次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

    C语言的指针用法

    C语言编程善用指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有指针才行的。也就是说精通C
    发表于 03-05 14:22 299次阅读
    <b class='flag-5'>C</b>语言的<b class='flag-5'>指针</b>用法

    c语言,c++,java,python区别

    操作系统、嵌入式系统等对性能要求较高的场景。C语言的语法相对简单,学习曲线较平缓,也是学习其他高级语言的入门语言。 C++C++是在C语言的基础上进行扩展和改进的一种编程语言。它支
    的头像 发表于 02-05 14:11 1920次阅读

    C++简史:C++是如何开始的

    的 MISRA C++:2023 博客系列的第二部分。 在这篇博客,我们将深入探讨 C++ 的历史、编程语言多年来的发展历程以及它的下一步发展方向。
    的头像 发表于 01-11 09:00 501次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    C语言和C++那些不同的地方

    ++11标准。根据不同的标准,它们的功能也会有所不同,但是越新的版本支持的编译器越少,所以本文在讨论的时候使用的C语言标准是C89,C++标准是C++99.我们来介绍
    的头像 发表于 12-07 14:29 869次阅读
    <b class='flag-5'>C</b>语言和<b class='flag-5'>C++</b><b class='flag-5'>中</b>那些不同的地方

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

    指针的基本概念。数组是一组相同类型的元素的集合,而指针是一个变量,它存储了一个地址,该地址指向内存的某个位置。在 C/C++
    的头像 发表于 12-07 13:46 545次阅读

    如何选择创建c语言和c++

    选择创建 C 语言和 C++ 都需要综合考虑多个因素。在决定使用哪种语言之前,我们需要对这两种语言的特点、优缺点、适用场景、学习成本等进行全面的了解和对比。下面是关于选择创建 C 语言和 C+
    的头像 发表于 11-27 15:58 545次阅读

    c++多行注释快捷键

    C++,多行注释(也称为块注释)是一种用于注释大段代码或多个语句的方法。当你希望暂时禁用一些代码或者解释特定部分代码的作用时,多行注释是非常有用的。 在C++,多行注释以 /*
    的头像 发表于 11-22 10:24 7802次阅读

    探索C++的编程习惯与编程要点

    C++的类可以分为带指针数据成员与不带指针数据成员两类,complex就属于不带指针成员的类。而这里要说的字符串类String,一般的实现会带有一个char *
    的头像 发表于 11-14 09:25 364次阅读
    探索<b class='flag-5'>C++</b>的编程习惯与编程要点

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

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