首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在类成员函数C++中使用关键字“const”两次

在C++中,关键字"const"用于修饰成员函数,表示该成员函数不会修改对象的状态。在类成员函数中使用关键字"const"两次的语法形式为:

代码语言:txt
复制
void functionName() const;

这里的第一个"const"表示该成员函数是一个常量成员函数,即在函数内部不能修改对象的任何成员变量。第二个"const"表示该成员函数返回一个常量值,即函数返回值不能被修改。

使用关键字"const"两次的目的是为了确保在常量对象上调用该成员函数时,不会对对象的状态进行修改。这样做的好处有以下几点:

  1. 提供了对常量对象的访问权限:常量对象是指被声明为const的对象,它们的状态不能被修改。通过在成员函数中使用关键字"const"两次,可以确保常量对象也能调用该成员函数,而不会产生编译错误。
  2. 增加代码可读性和可维护性:在成员函数中使用关键字"const"两次可以明确地表明该函数不会修改对象的状态,使代码更加清晰和易于理解。同时,这也提醒开发人员在编写函数体时要遵守不修改对象状态的规则,增加了代码的可维护性。
  3. 支持函数重载:在C++中,函数的重载是指在同一个作用域内,可以有多个同名函数,但它们的参数列表必须不同。使用关键字"const"两次可以实现对常量对象和非常量对象的重载,从而提供更灵活的函数调用方式。

总结起来,使用关键字"const"两次可以确保成员函数不会修改对象的状态,提高代码的可读性和可维护性,并支持函数重载。在实际应用中,常见的应用场景包括但不限于:定义常量成员函数、操作常量对象、提供只读访问接口等。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云官网:https://cloud.tencent.com/
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++const成员变量和成员函数

,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。...初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击《C++初始化列表》回顾。...const成员函数(常成员函数const 成员函数可以使用的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。...常成员函数需要在声明和定义的时候函数头部的结尾加上 const 关键字,请看下面的例子: class Student{ public: Student(char *name...需要强调的是,必须在成员函数的声明和定义处同时加上 const 关键字

19530

C++C++ 的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

一、常量成员函数 1、const 修饰成员函数分析 C++ , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 下面的 Student , 定义了 void fun(int...age, int height) 成员函数 , 下面使用 const 关键字修饰该类 ; 使用 const 修饰 成员函数 , 写法如下 , fun() 之后使用 const 关键字修饰 函数 :... * 右边修饰的是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 成员函数 // const 关键字可以 // void...const int age; // 年龄 const int height; // 身高 如果 成员函数const 关键字 声明为 常量成员函数 , 则在该函数 不能修改 对象的 任何成员变量...// 使用 const 修饰 成员函数 // const 关键字可以 // void fun(int age, int height) 之后 , 大括号之前 , // void

17820

const修饰成员变量及函数

const,可以修饰成员变量和成员函数,主要目的也是保护成员内部的一些属性不被轻易的修改。以保证数据的完整性。下面分别介绍const修饰成员变量和成员函数。...const修饰成员变量表示成员常量,只能在初始化列表赋值,可以被const和非const成员函数调用,但不能修改其值。...= 300; } ~CConst(void); private: // const 成员变量 const int iValue; }; const修饰成员函数目的是不让函数修改内部的数据成员,而且不会调用其他非...const成员函数(如果调用则编译出错) #include using namespace std; class CConst { public: // 初始化列表初始化const成员函数...CConst(void):x(200), y(300){} // const 成员函数const修饰符只能在函数名后面 void display() const { // 不能调用非const函数

18520

C++const和非const对象分别调用const和非const成员函数

5、const成员函数不能调用非const成员函数 6、非const成员函数可以调用非const成员函数 我们知道c++成员函数还会隐式传入一个指向当前对象的this指针,所以test,...实际的print函数应该是这样的void print(test * this);,这代表一个指向test对象的指针this被传入到了print函数 假如现在我们用test创建一个对象, 1 test...test* this,即这时会出现类型不匹配的错误,visual studio 中会出现类似于下面的错误: 4 所以通过上面的说明,我们知道了为什么const 对象不能调用非const成员函数。...下面解释为什么const 对象可以调用const成员函数, 1 class test{ 2 public: 3 void print()const; 4 }; 前面我们把非const成员函数print...* this; 是和void print() const;this指针的类型是一样的,所以常量对象可以调用const成员函数

1.1K20

C++和对象】const成员函数及流插入提取

目录 前言 1.const成员函数 2.取地址以及const取地址操作符重载 3.流插入流提取运算符重载 4.结语 1.const成员函数 const成员函数是指在函数声明和定义时使用const关键字修饰的成员函数...const修饰成员函数,实际修饰该成员函数隐含的this指针,表明成员函数不能对的任何成员进行修改。...2.取地址以及const取地址操作符重载 这两个默认成员函数一般不用重新定义,编译器默认会生成; C++使用&操作符可以取得一个对象的地址。...对于const对象,也可以使用&操作符来取得其地址; C++,可以重载&操作符,假设有一个Date,可以重载&操作符,如下所示: class Date { public : Date*...C++中流插入提取操作符重载是不可以重载成成员函数,因为它们参数的顺序不可以改变,例如: 这是因为流插入第一个运算符是cout,而如果将其重载为成员函数第一个参数就是和对象隐含的this指针

9210

C++与对象——流操作符重载,const成员函数

与对象 流操作符重载 1 << 重载 2 >> 重载 const 修饰 Thanks♪(・ω・)ノ谢谢阅读!!! 下一篇文章见!!!...(Date* this, ostream& out) 作为成员函数重载,this指针占据第一个参数,Date必须是左操作数!...那为了规避这个问题,我们就要把函数参数的顺序改变,所以我们的重载就不能是成员函数。...我们把重载<<作为全局函数来看呢 这时我们可以正确的输出了,但是代价是我们成员变量改为公有了,不然我们重载<<函数无法访问成员变量,这就让我们这个变得不够安全,所以这里使用友元来解决。...: 所以需要加入const修饰: 对于一些只读的函数,我们可以都加上const 让代码鲁棒性更加强大。

8810

C++和对象以及成员函数

参考链接: 如何通过C++函数传递和返回对象? 一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,C++实体对应的就是对象,实体抽象数据类型就是,属性是成员变量,行为是成员函数。 ...protected:(继承和派生)一子类可以访问父的保护成员。  private:只有才能被访问。 ...C++,结构体默认是全部都可见的,而默认是私有的。 ...空的实例不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存占有一定的空间,否则无法使用这些实例。至于占多少内存,由编译器决定。VS是1。 ...那么定义和外定义有什么区别呢??  ①如果在定义,函数调用的时候编译器会当做内联函数处理,调用点将代码展开;  ②如果在外定义,函数调用时和普通函数一样,进行栈桢的开辟和回退。

1.3K20

C++奇迹之旅:和对象const成员&&static关键字&&友元&&内部类

const 成员函数是指在中被声明为 const成员函数const修饰的“成员函数”称之为const成员函数const修饰成员函数,实际修饰该成员函数隐含的this指针,表明成员函数不能对的任何成员进行修改...小结:const 关键字使用只会导致权限的放小,不会导致权限的放大。...,它是定义外部的普通函数,不属于任何,但需要在的内部声明,声明时需要加friend关键字。...比如上述Time和DateTime声明Date为其友元,那么可以Date中直接访问Time的私有成员变量,但想在Time访问Date私有的成员变量则不行。...,只不过此时计算机还不清楚,想要让计算机识别人想象的洗衣机,就需要人通过某种面相对象的语言(比如:C++、Java、Python等)将洗衣机用来进行描述,并输入到计算机 经过2之后,计算机中就有了一个洗衣机

10110

C++ const 和 constexpr关键字解析:常量、函数和指针

很多C++的初学者看到const这个关键字的第一反应都是一头雾水,主要是因为const可以出现在很多的位置,以及后面加入的constexpr更是常常感到困惑,今天就为大家一一解释出现它们的含义和以及作用...很多的全局变量都是通过常量来进行修饰,需要注意的是,使用const关键字修饰的变量需要立刻初始化 // 修饰局部变量,全局变量,成员变量 const int a = 2; // 错误,表达式必须是可修改的左值...引用 这是const最常用的一种方式,通常用于函数的参数列表,因为我们知道C++函数参数有3传递方式,分别是值传递,指针传递(或者叫地址传递),引用传递,前两种传递时都会发成拷贝行为 指针本身也是一个变量...是C++11引入的一个关键字,它的作用主要是用来修饰一些函数和变量,使其成为常量表达式,从而在编译器就可以进行计算,进一步提高程序运行期的效率 常量表达式:指的是有一个或多个常量组成的表达式,实际开发中经常会接触到常量表达式...const_cast类型转换来修改值,而constexpr是不可以修改的,其实可以将const理解为只读变量更符合其含义 const只能用于非静态成员函数,而constexpr可以和成员,非成员,构造函数一起使用

68420

C++】泛型编程 ⑫ ( 模板 static 关键字 | 模板 static 静态成员 | 模板使用流程 )

函数声明 和 实现 写在相同的 .cpp 源码文件 ; 模板 的 函数实现 外部进行 , 函数声明 和 实现 写在不同的 .h 和 .cpp 源码文件 ; 博客 【C++】泛型编程 ⑨ (...; 博客 【C++】泛型编程 ⑩ ( 模板的运算符重载 - 函数实现 写在外部的同一个 cpp 代码 | 模板 的 外部友元函数二次编译问题 ) , 分析了 第二种情况 , 模板 的...函数实现 外部进行 , 写在 一个 cpp 源码文件 ; 博客 【C++】泛型编程 ⑪ ( 模板的运算符重载 - 函数实现 写在外部的不同的 .h 头文件和 .cpp 代码 ) ,...static 关键字 1、模板 static 静态成员 模板 , 定义了 static 静态成员变量 ; 静态 成员变量 是属于整个的 , 但是对于 模板 来说 , 存在着二次编译 , 会生成多个不同的实际...不同的 , 每个 都有一个 static 静态成员 , 相互之间是独立的 ; 2、模板 static 关键字 用法 模板 static 关键字 用法 : 首先 , 模板 , 声明 static

17710

C++设计模式之SFINAE:用来检测是否有某个成员函数

针对特定成员函数的检测其实在工作也可能用到。C++可以用SFINAE技巧达到这个目的。...属于C++模板编程的高级技巧,但属于模板元编程的基本技巧。当然我其实也并不是C++元编程方面的专家,只是搜集过一些常见的实现方式,然后做过一些测试。...在这个过程,我发现有些常见的SFINAE写法是有问题的,下面探讨一下。 举个例子,我们来check一下C++标准库的中有没有push_back()成员函数。...则是const value_type&。所以才用了两个Helper。如果是检测其他成员函数,比如size则不需要这么麻烦只要一个Helper即可。...如果需求是要检测任意成员函数,而不限定是哪个函数的话,毫无疑问,需要借助宏了。将上面的代码改变成宏的版本,push_back作为宏的一个参数,即可。 我这里为什么用push_back()举例呢?

3.2K20

C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 成员变量 提供初始值 ; 初始化列表 可以 调用 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入的 参数 ; 初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 的 初始化列表 const 成员变量初始化 1、初始化 const 常量成员 如果 定义了 被 const 修饰 的 成员变量...进行赋值 的 , 因此 这里 必须在 构造函数的 初始化列表const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 B , 定义了常量 const int..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 初始化列表初始化常量成员 在下面的 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

17130

从零开始学C++之对象的使用(一):static 成员变量、static 成员函数对象的大小

非static数据成员存在于类型的每个对象,static数据成员独立该类的任意对象存在,它是与关联的对象,不与对象关联。...(1)、static成员的定义 static成员需要在定义体外进行初始化与定义 (2)、特殊的整型static const成员 整型static const成员可以定义体初始化,...:     const int a;   //只能在构造函数初始化列表初始化     static int b;    //的实现文件定义并初始化     const static int c;...const int Test::c = 0; //注意:给静态成员变量赋值时,不需要加static修饰符,但要加const (3)、static成员优点: static成员的名字是的作用域中...虚函数的大小的影响(参考这里) 虚继承对的大小的影响(参考这里) 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

1.2K00

为什么Java成员变量不能被重写?成员变量Java能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域的方法

这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏) 成员变量Java能够被重写么?...这是为什么呢?...意思就是: 一个,子类成员变量如果和父成员变量同名,那么即使他们类型不一样,只要名字一样。父成员变量都会被隐藏。子类,父成员变量不能被简单的用引用来访问。...其实,简单来说,就是子类不会去重写覆盖父成员变量,所以成员变量的访问不能像方法一样使用多态去访问。...访问隐藏域的方法 就是使用的引用类型,那么就可以访问到隐藏域,就像我们例子的代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

3.5K40

c语言random函数vc,C++ 随机函数random函数使用方法

C++ 随机函数random函数使用方法 一、random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。 可改用C++下的rand函数来实现。...(但这样便于程序调试) 2、C++另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。...若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。...如大家所说,还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。...三、按要求设置概率 比如要设置一个10%的概率问题,我们可以采取rand()函数来实现,if条件句判断里,用rand()得到的值%一个设定的值,再与另一个值做“==”运算。

3.8K20
领券