C++: C++函数声明的时候后面加const

C++: C++函数声明的时候后面加const

转自:http://blog.csdn.net/zhangss415/article/details/7998123

非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用。例如: 

复制代码
 1 class A { 2     private: int m_a; 3     public: 4         A() : m_a(0) {} 5          int getA() const  { 6              return m_a; //同return this->m_a;。7          } 8          int GetA() { 9              return m_a; 
10          } 
11          int setA(int a) const { 
12              m_a = a; //这里产生编译错误,如果把前面的成员定义int m_a;改为mutable int m_a;就可以编译通过。 
13          } 
14          int SetA(int a)  { 
15              m_a = a; //同this->m_a = a;
16          } 
17 }; 
18 A a1; 
19 const A a2; 
20 int t; 
21 t = a1.getA(); 
22 t = a1.GetA(); 
23 t = a2.getA(); 
24 t = a2.GetA(); //a2是const对象,                    
复制代码

调用非const成员函数产生编译错误。 一般对于不需修改操作的成员函数尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题,同时保持逻辑的清晰。

 

补充:

c++ 在函数后加const的意义:我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。
 

1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误) 2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,     任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用); 3、唯一的例外是对于mutable修饰的成员。     加了const的成员函数可以被非const对象和const对象调用     但不加const的成员函数只能被非const对象调用

char getData() const{         return this->letter;

}

 

c++ 函数前面和后面 使用const 的作用:

前面使用const 表示返回值为const

后面加 const表示函数不可以修改class的成员

请看这两个函数

const int getValue();

int getValue2() const;

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
 * FunctionConst.h
 */

#ifndef FUNCTIONCONST_H_
#define FUNCTIONCONST_H_

class FunctionConst {
public:
    int value;
    FunctionConst();
    virtual ~FunctionConst();
    const int getValue();
    int getValue2(const;
};

#endif /* FUNCTIONCONST_H_ */

源文件中的实现

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * FunctionConst.cpp 
 */

#include "FunctionConst.h"

FunctionConst::FunctionConst():value(100{
    // TODO Auto-generated constructor stub

}

FunctionConst::~FunctionConst({
    // TODO Auto-generated destructor stub
}

const int FunctionConst::getValue(){
    return value;//返回值是 const, 使用指针时很有用.
}

int FunctionConst::getValue2(const{
    //此函数不能修改class FunctionConst的成员函数 value
    value 15;//错误的, 因为函数后面加 const
    return value;
}

 

分类: C++学习笔记

转载于:https://www.cnblogs.com/tsh292278/p/10470628.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计蒜客习题】消除字符串

问题描述 蒜头君喜欢中心对称的字符串,即回文字符串。现在蒜头君手里有一个字符串 SS,蒜头君每次都会进行这样的操作:从 SS 中挑选一个回文的子序列,将其从字符串 SS 中去除,剩下的字符重组成新的字符串 SS。 蒜头君想…

HierarchicalBeanFactory

BeanFactory分层 package org.springframework.beans.factory;//分层工厂 public interface HierarchicalBeanFactory extends BeanFactory {//返回工厂的父工厂BeanFactory getParentBeanFactory();//这个工厂中是否包含这个Beanboolean containsLocalBean(String name); }测…

Training a classifier

你已经学习了如何定义神经网络,计算损失和执行网络权重的更新。 现在你或许在思考。 What about data? 通常当你需要处理图像,文本,音频,视频数据,你能够使用标准的python包将数据加载进numpy数组。之后你能够转换这些…

19岁白帽子通过bug悬赏赚到一百万美元--转

出处:https://news.cnblogs.com/n/620858/ 19 岁的 Santiago Lopez 通过 bug 悬赏平台 HackerOne 报告漏洞,成为第一位通过 bug 悬赏赚到一百万美元的白帽子黑客。他的白帽子生涯始于 2015 年,至今共报告了超过 1600 个安全漏洞。他在 16 岁时…

代码分层的设计

分层思想,是应用系统最常见的一种架构模式,我们会将系统横向切割,根据业务职责划分。MVC 三层架构就是非常典型架构模式,划分的目的是规划软件系统的逻辑结构便于开发维护。MVC:英文即 Model-View-Controller&#xff…

【24小时内第四更】为什么我们要坚持写博客?

前言 从2018年7月份,我开始了写作博客之路。开始之前,我打算分享下之前的经历。去年初公司来了个架构师,内部分享过docker原理,TDD单元测试驱动,并发并行异步编程等内容,让我着实惊呆了,因为确实…

sqoop快速入门

转自http://www.aboutyun.com/thread-22549-1-1.html 转载于:https://www.cnblogs.com/drjava/p/10473297.html

ListableBeanFactory接口

ListableBeanFactory获取bean时,Spring 鼓励使用这个接口定义的api. 还有个Beanfactory方便使用.其他的4个接口都是不鼓励使用的. 提供容器中bean迭代的功能,不再需要一个个bean地查找.比如可以一次获取全部的bean(太暴力了),根据类型获取bean.在看SpringMVC时,扫描包路径下的…

HDU 4035 Maze

Maze http://acm.hdu.edu.cn/showproblem.php?pid4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率走到其他的位置(分为父节点和子节点讨论)。 转移方程就是&a…

面向对象之三大特性:继承,封装,多态

python面向对象的三大特性:继承,封装,多态。 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了⼀个很⽜B的函数. 那这个也可以被称为…

configurablebeanfactory

ConfigurableBeanFactory定义BeanFactory的配置.ConfigurableBeanFactory中定义了太多太多的api,比如类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系,合并其他ConfigurableBeanFactory,bean如何销毁. ConfigurableBeanFactory同时继承了Hi…

Xlua文件在热更新中调用方法

Xlua文件在热更新中调用方法 public class news : MonoBehaviour { LuaEnv luaEnv;//定义Lua初始变量 void Awake() { luaEnv new LuaEnv();//new开辟空间 luaEnv.AddLoader(myload);//调用方法地址、返回字节 luaEnv.DoString("requirefish");//更新文件 } void O…

springboot 使用的配置

1,控制台打印sql logging:level:com.sdyy.test.mapper: debug 2,开启驼峰命名 mybatis.configuration.map-underscore-to-camel-casetrue 转载于:https://www.cnblogs.com/xiaohu1218/p/10477318.html

AutowireCapableBeanFactory接口

AutowireCapableBeanFactory在BeanFactory基础上实现了对存在实例的管理.可以使用这个接口集成其它框架,捆绑并填充并不由Spring管理生命周期并已存在的实例.像集成WebWork的Actions 和Tapestry Page就很实用. 一般应用开发者不会使用这个接口,所以像ApplicationContext这样的…

外观模式

一、什么是外观模式   有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝…

OC内存管理

OC内存管理 一、基本原理 (一)为什么要进行内存管理。 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的…

cf1132E. Knapsack(搜索)

题意 题目链接 Sol 看了status里面最短的代码。。感觉自己真是菜的一批。。直接爆搜居然可以过&#xff1f;。。但是现在还没终测所以可能会fst。。 #include<bits/stdc.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #defi…

ConfigurableListableBeanFactory

ConfigurableListableBeanFactory 提供bean definition的解析,注册功能,再对单例来个预加载(解决循环依赖问题). 貌似我们一般开发就会直接定义这么个接口了事.而不是像Spring这样先根据使用情况细分那么多,到这边再合并 ConfigurableListableBeanFactory具体&#xff1a; 1、…

焦旭超 201771010109《面向对象程序设计课程学习进度条》

《2018面向对象程序设计&#xff08;java&#xff09;课程学习进度条》 周次 &#xff08;阅读/编写&#xff09;代码行数 发布博客量/博客评论量 课堂/课余学习时间&#xff08;小时&#xff09; 最满意的编程任务 第一周 50/20 1/0 6/4 九九乘法表 第二周 90/5…

面试题集锦

1. L1范式和L2范式的区别 (1) L1范式是对应参数向量绝对值之和 (2) L1范式具有稀疏性 (3) L1范式可以用来作为特征选择&#xff0c;并且可解释性较强&#xff08;这里的原理是在实际Loss function 中都需要求最小值&#xff0c;根据L1的定义可知L1最小值只有0&#xff0c;故可以…