C++ const常量对象、常量成员函数和常引用
微信公众号:「小林coding」
用简洁的方式,分享编程小知识。
01 常量对象
如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字
class CTest
{
public:
void SetValue() {}
private:
int m_value;
};
const CTest obj; // 常量对象
02 常量成员函数
在类的成员函数后面可以加const关键字,则该成员函数成为常量成员函数。
- 在常量成员函数中不能修改成员变量的值(静态成员变量除外);
- 也不能调用同类的 非 常量成员函数(静态成员函数除外)
class Sample
{
public:
void GetValue() const {} // 常量成员函数
void func(){}
int m_value;
};
void Sample::GetValue() const // 常量成员函数
{
value = 0; // 出错
func(); // 出错
}
int main()
{
const Sample obj;
obj.value = 100; // 出错,常量对象不可以被修改
obj.func(); // 出错,常量对象上面不能执行 非 常量成员函数
obj.GetValue // OK,常量对象上可以执行常量成员函数
return 0;
}
03 常量成员函数的重载
两个成员函数,名字和参数表都一样,但是一个是const,一个不是,那么是算是重载。
class Sample
{
public:
Sample() { m_value = 1; }
int GetValue() const { return m_value; } // 常量成员函数
int GetValue() { return 2*m_value; } // 普通成员函数
int m_value;
};
int main()
{
const Sample obj1;
std::cout << "常量成员函数 " << obj1.GetValue() << std::endl;
Sample obj2;
std::cout << "普通成员函数 " << obj2.GetValue() << std::endl;
}
执行结果:
常量成员函数 1
普通成员函数 2
04 常引用
引用前面可以加const关键字,成为常引用。不能通过常引用,修改其引用的变量的。
const int & r = n;
r = 5; // error
n = 4; // ok!
对象作为函数的参数时,生产该对象参数是需要调用复制构造函数的,这样效率就比较低。用指针作为参数,代码又不好看,如何解决呢?
可以用对象的引用作为参数,防止引发复制构造函数,如:
class Sample
{
...
};
void Func(Sample & o) // 对象的引用作为参数
{
...
}
但是有个问题,对象引用作为函数的参数有一定的风险性,若函数中不小心修改了形参0,则实参也会跟着变,这可能不是我们想要的,如何避免呢?
可以用对象的常引用作为参数,如:
class Sample
{
...
};
void Func(const Sample & o) // 对象的常引用作为参数
{
...
}
这样函数中就能确保不会出现无意中更改o值的语句了。
C++ const常量对象、常量成员函数和常引用的更多相关文章
- 用 const 限定类的成员函数
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于 ...
- [转载]能不能同时用static和const修饰类的成员函数?
题目(一):我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量).请问:能不能同时用static和con ...
- .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。
static的作用: 对变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量. 1)内存中的位置:静态存储区 2)初始化:局部的静态变量只能被初始化一次, ...
- 【转】C++ const成员变量和成员函数(常成员函数)
转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...
- C++ const成员变量和成员函数(常成员函数)
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只 ...
- c++ 常成员函数 和 常对象
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zhuyingqingfen/article/details/31751111 先明白几个概念: 1. ...
- const关键字对C++成员函数的修饰
const对C++成员函数的修饰分为三种:1. 修饰参数:2. 修饰返回值:3. 修饰this指针.简述一下知识点如下,以后找功夫再完善. 1. 对函数参数的修饰. 1)const只能用来修饰输入参数 ...
- C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数
C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...
- C++中const对象和非const对象调用成员函数问题
一.类MyClass 二.主函数调用 三.结果
随机推荐
- Wpf Dispatcher.BeginInvoke((Action)delegate{}));
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/w ...
- 缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter
package seday07; import java.io.IOException;import java.io.PrintWriter; /*** @author xingsir * 缓冲字符流 ...
- ORM和Mybatis
ORM框架 概述 在学习MyBatis之前,先来看看什么是ORM框架. ORM全称Object/Relation Mapping,对象/关系数据库映射,功能为完成对象的编程语言到关系数据库的映射,可以 ...
- sed 面试题
#oldboy my qq num is 49000448.$ not 4900000448. my god ,i am not oldbey,but clsn!$ #oldboy my name i ...
- java学习第一步-工欲善其事必先利其器
Java SE 磨刀不误砍柴工,工欲善其事必先利其器,咱们先搞好硬件配置,才能顺利的搞好Java学习 阶段一 1.认识Java 2.java发展史及用户 3.配置Java环境 4.JDK8下载安装 5 ...
- 从零开始制作cli工具,快速创建项目脚手架
背景 在工作过程中,我们常常会从一个项目工程复制代码到一个新的项目,改项目配置信息.删除不必要的代码. 这样做的效率比较低,也挺繁琐,更不易于分享协作. 所以,我们可以制作一个cli工具,用来快速创建 ...
- jsb闭包
1.什么是闭包? anw:能够读取其他函数内部变量的函数 本质:将函数内部与函数外部连接起来 2.由于在js中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成’定义一个在函数内部的函数 ...
- Spring Boot 2 发布与调用REST服务
开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1.8 一.发布REST服务 1.IDEA新建一个名称为rest-server的Spring Boot项目 2.新 ...
- QT--HTTP文件下载器
QT--HTTP文件下载器 1.pro文件添加 QT += core gui network 2.头文件 #include <QNetworkAccessManager> #i ...
- Hadoop、storm和Spark Streaming简单介绍(非原创)
文章大纲 一.Hadoop是什么二.storm是什么三.Spark Streaming是什么四.Spark与storm比较五.参考文章 一.Hadoop是什么 1. 简介 Hadoop是一个由Ap ...
