Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++ const常量对象、常量成员函数和常引用

C++ const常量对象、常量成员函数和常引用

作者头像
小林coding
发布于 2020-03-31 08:31:40
发布于 2020-03-31 08:31:40
1.4K00
代码可运行
举报
文章被收录于专栏:小林coding小林coding
运行总次数:0
代码可运行

1

常量对象

如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加 const 关键字。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CTest
{
public:
    void SetValue() {}
private:
    int m_value;
};

const CTest obj; // 常量对象

2

常量成员函数

在类的成员函数后面可以加 const 关键字,则该成员函数成为常量成员函数。

这里有两个需要注意的点:

  • 在常量成员函数中不能修改成员变量的值(静态成员变量除外);
  • 也不能调用同类的 非 常量成员函数(静态成员函数除外)。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}

3

常量成员函数重载

两个成员函数,名字和参数表都一样,但是一个是 const,一个不是,那么是算是重载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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


4

常引用

引用前面可以加 const 关键字,成为常引用。不能通过常引用,修改其引用的变量的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int & r = n;
r = 5; // error
n = 4; // ok!

对象作为函数的参数时,生产该对象参数是需要调用复制构造函数的,这样效率就比较低。用指针作为参数,代码又不好看,如何解决呢?

可以用对象的引用作为参数,防止引发复制构造函数,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Sample
{
    ...
};

void Func(Sample & o) // 对象的引用作为参数
{
    ...
}

但是有个问题,对象引用作为函数的参数有一定的风险性,若函数中不小心修改了形参 o,则实参也会跟着变,这可能不是我们想要的,如何避免呢?

可以用对象的常引用作为参数,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Sample
{
    ...
};

void Func(const Sample & o) // 对象的常引用作为参数
{
    ...
}

这样函数中就能确保不会出现无意中更改 o 值的语句了。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小林coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
在 C++ 类中 , 普通的非静态成员函数 , 可以使用 const 进行修饰 ,
韩曙亮
2023/10/15
2300
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
C++:23 再议const的用法(下)
(2)不能将const 类型的实参传递给形参为non-const 类型引用的函数。
用户3479834
2021/02/03
4030
C/C++ const
const是C语言的关键字,经C++扩充,功能变得强大,用法复杂。const用于定义一个常变量(只读变量)。当const与指针、引用、函数等结合起来使用时,情况会变得更加复杂。下面将从七个方面总结const的用法。
恋喵大鲤鱼
2018/08/03
8770
类和对象的提高
#this指针 其作用就是指向成员函数所作用的对象 非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针 例如:想要将某对象的公有成员自增,写一个函数 complex addone(){ this->real++;// 等价于real++; this->print();//等价于print return *this; } 在主函数中: int main(){ complex c1(1,1),c2(0,0); c2=c1.addone(); //这样不需要再传递参数了 return 0; } *静态成员函数不能使用this指针,因为静态成员函数并不具体作用某个对象 *因此,静态成员函数的真实的参数的个数,就是程序中写出的参数个数 #静态成员函数 静态成员,在声明前面加上static关键字 普通对象每个成员都有各自的一份,静态成员变量被所有对象所共享 普通成员函数必须具体作用于某个对象,静态成员函数并不具体作用于某个对象 **因此静态成员不需要通过对象就可以访问** 访问静态成员 1.类名::成员名 2.对象名.成员名 3.指针->成员名 4.引用.成员名 静态成员变量本质上全局变量,静态成员函数本质上是全局函数 例如,考虑一个随时知道矩形总数和总面积的图形处理程序 可以用全局变量或者静态成员变量来表示,但考虑不同 结构体中定义中,将w,h定义长宽,当出现一个对象时候(**在构造函数里完成**),总数变量加1,面积变量也是增加 同理在**析构函数**里面将其对应的减少,值得注意的是不能忘记了复制构造函数 *在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数 #成员对象和封闭类 有成员对象的类叫做封闭类(在一个类里面有其他类(被称为成员对象),这个类叫封闭类) 任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象是如何初始化的 具体做法是:*通过封闭类的构造函数的初始化列表 *封闭类构造函数和析构函数的执行顺序 1.先执行所有对象成员的构造函数,然后执行封闭类的构造函数 2.对象成员的构造函数调用次序和对象成员在类中的说明次序一次 3.当封闭类的对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数 #常量对象 常引用 如果不希望某个对象的值被改变,则定义该对象前可以加上const 可以在类的成员函数后面加上const关键字,则为常量成员函数 *常量成员函数执行期间不应修改其所作用的对象(成员对象,成员函数) 例如:void getvalue() const; //声明 注意*常量对象不能执行非常量成员函数,可以执行常量成员函数 #友元 友元分为友元函数和友元类两种 友元函数:一个类的友元函数可以访问该类的私有成员 声明:在前面加上frind 目的:为了保证某个类的函数能够访问其他类的私有成员 友元类:如果a时b的友元类,那么a的成员函数可以访问b的私有成员 *友元类之间的关系不能传递,不能继承
废江_小江
2022/09/05
2850
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )
类成员方法 , 除了定义构造方法与析构方法之外 , 还可以定义普通的成员方法 , 如设置 int age 变量的方法 , 这里声明一个成员方法 , 传入参数 int age , 给成员变量 int age 赋值 ;
韩曙亮
2023/03/27
5310
【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )
C++:09---类静态成员、类常量成员
一、类静态成员(static) 先介绍一下什么是静态变量、静态函数 静态局部变量:存在域(全局数据区),作用域(块作用域) 静态全局变量:存在域(全局数据区),作用域(整个文件) 静态函数:存在域(全局数据区),作用域(整个文件) static int a=10;//全局静态变量 static void add();//静态函数 int main() { { static int b=10;//局部静态变量 } } 特点: 静态static修饰的变量、函数,只需要初始化一
用户3479834
2021/02/03
1.6K0
C++:09---类静态成员、类常量成员
C++基础知识精髓
例程中声明一个命名空间Test,Test中声明一个结构体Account,而Account中定义变量和声明函数。
Linux兵工厂
2023/02/28
2K0
C++基础知识精髓
C++必知必会之基础知识-常用关键字(1)
Hello,大家好!我是木荣。温故而知新,可以为师矣。作为一名攻城狮,扎实的基本功是解决问题及完成工作中任务的重要前提。没有良好的基本功作为铺垫,一味的追求知识的宽度是毫无意义,知其然更要知其所以然。因此,在平时和小伙伴们聊天时,在谈到学习技术方面的问题,我会告诉他们注重基本功。所以,最近文章会总结一些日常编程工作中常用的重要基本知识点,根据平时工作中常用的也是重要的知识点逐步展开。
Linux兵工厂
2023/09/15
2150
C++必知必会之基础知识-常用关键字(1)
【C++】const对象和const成员
如果我们在定义一个对象之后,不希望在后面对这个对象进行修改,那么我们可以把这个对象声明为const对象。 声明为const对象之后,这个对象的所有数据成员后面都不能被修改!
谙忆
2021/01/21
1.2K0
c++面向对象的一些问题1.0
构造函数 特殊的成员函数,给对象的初始化,不需要用户调用,建立对象时,自动执行 它的函数名字与类相同,可以重载,没有返回值和函数类型。 如果不写构造函数,类会给出一个无参数的构造函数。 复制构造函数 a.程序新建立一个对象时,用另一个对象对它初始化。 b. 函数的参数为对象。 c. 函数的返回值为对象。 ---- 特殊的数据成员 常数据成员,const声明,其值不能改变。 const string sex; 静态数据成员,static声明,属于类,只能在类外初始化。 stat
热心的社会主义接班人
2018/04/27
5750
c++面向对象的一些问题1.0
c++之const修饰成员函数
常函数: 成员函数后加const后我们称这个函数为常函数; 常函数不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加const 常对象只能调用常函数 常函数: #include<iostream> using namespace std; class Person { public: int age; mutable int tmp;//用mutable修饰的为特殊变量,可以在常量函数中修改 void showPerson()
西西嘛呦
2020/08/26
6540
【C++】自引用this指针的秘密
当我们在进入一个房子之后,可以看见房子里的桌子、椅子、地板等,但是看不到房子的全貌。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个个实例。
全栈程序员站长
2022/08/29
8490
【C++】自引用this指针的秘密
C++:30 ---C++类成员,成员函数的内存布局
这里要指出的是大家可以看到静态成员函数和静态成员变量sx的地址都是0x00007FF开头的,实际上他们都在全局数据区域存储(全局变量,静态变量),如果你有耐心,可以断点查看下栈空间内的局部变量i的地址:
用户3479834
2021/02/03
1.3K0
C++:30 ---C++类成员,成员函数的内存布局
C++类与对象(三)
在调用构造函数的时候,就不是初始化成员变量了,而是给成员变量赋值。 C++中成员变量的初始化是在这里。
有礼貌的灰绅士
2023/03/28
3900
C++类与对象(三)
C++核心编程学习
包含常量区;主要是存放全局变量,静态变量,字符串常量,const修饰的全局变量, 不包括const修饰的局部变量(区域的数据在程序结束后由操作系统释放)
买唯送忧
2021/09/11
4010
【C++】C++核心编程部分-内存分区模型-引用-函数提高-类与对象-文件操作
相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili(84-146)
半生瓜的blog
2023/05/12
1.9K0
【C++】C++核心编程部分-内存分区模型-引用-函数提高-类与对象-文件操作
C/C++常见面试知识点总结附面试真题—-20220326更新
C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)和常量存储区(常量)。此外,C++中有自由存储区(new)一说。 全局变量、static变量会初始化为缺省值,而堆和栈上的变量是随机的,不确定的。
全栈程序员站长
2022/09/14
1.6K0
C/C++常见面试知识点总结附面试真题—-20220326更新
c++系列之二 指向成员函数的指针(烧脑)
这是一篇翻译的文章,原文详细解释了C++中指向成员函数的指针,因为带有“教程”一词,所以比较通俗易懂。为了使文章读起来通俗有趣,翻译君并未一字一句一板一眼地翻译,并大量使用了诙谐的词汇(如“码农”)。另外,原文的某些地方分段不太合适(小学语文可能是体育老师教的。。),有些地方也稍嫌啰嗦,所以翻译君自己作了一些调整。如果对翻译君的翻译质量有意见,建议前往 原地址 围观。
程序员小王
2019/05/05
3.1K0
c++系列之二 指向成员函数的指针(烧脑)
C++面向对象程序设计
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
浪漫主义狗
2022/09/28
1.2K0
const成员函数一定是线程安全的吗?
//这个概念是为了实现限制成员函数仅仅用于左值或右值,带有引用修饰词的成员函数,不必是虚函数
用户9831583
2022/12/04
1.1K0
const成员函数一定是线程安全的吗?
相关推荐
【C++】C++ 类中的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文