当前位置: 首页 > article >正文

C++ 常函数、常对象

在C++中,常函数(也称为常量成员函数)和常对象是与对象的不可变性相关的两个概念。它们用于确保对象的状态在特定操作下不会被改变。

常函数(常量成员函数)

常函数是指通过const关键字修饰的成员函数。这种函数保证不会修改其所属对象的任何成员变量(除非这些成员变量被声明为mutable)。常函数可以在常量对象上被调用,这是非常有用的特性,因为它允许在不改变对象状态的情况下读取数据。

常函数的声明方式如下:

class MyClass {
public:
    void myFunction() const; // 常函数
    // ...
};

在常函数内部,不能修改类的任何非mutable成员变量。尝试这样做将导致编译错误。

常对象

常对象是通过const关键字修饰的对象。一旦对象被声明为常量,就不能再调用其任何非常量成员函数(即那些没有被声明为const的成员函数)。这是因为非常量成员函数可能会修改对象的状态,而常对象的状态是不允许被修改的。

常对象的声明方式如下:

const MyClass myObject; // 常对象

或者,你也可以通过指针或引用来声明常对象:

const MyClass* myObjectPtr = &someOtherObject; // 指向常对象的指针
const MyClass& myObjectReference = someOtherObject; // 对常对象的引用

在这种情况下,你只能通过指针或引用调用常成员函数。

示例

下面是一个简单的示例,展示了常函数和常对象的使用: 

#include <iostream>

class MyClass {
public:
    MyClass(int value) : value_(value) {}

    int getValue() const { // 常函数
        return value_;
    }

    void setValue(int newValue) { // 非常量成员函数
        value_ = newValue;
    }

private:
    int value_;
};

int main() {
    const MyClass myConstObject(10); // 常对象
    std::cout << "Value: " << myConstObject.getValue() << std::endl; // 可以调用常函数
    // myConstObject.setValue(20); // 错误!不能调用非常量成员函数

    MyClass myObject(5); // 非常量对象
    std::cout << "Value: " << myObject.getValue() << std::endl; // 可以调用常函数
    myObject.setValue(15); // 可以调用非常量成员函数
    std::cout << "New Value: " << myObject.getValue() << std::endl;

    return 0;
}
Value: 10
Value: 5
New Value: 15

在这个示例中,MyClass有一个常函数getValue(),它返回对象的值而不修改它。还有一个非常量成员函数setValue(),它用于设置对象的值。在main()函数中,我们创建了一个常对象myConstObject和一个非常量对象myObject。我们可以在常对象上调用常函数,但不能调用非常量成员函数。对于非常量对象,我们可以调用任何成员函数。


http://www.kler.cn/a/399296.html

相关文章:

  • 深入解析Javascript中的this指向
  • 【数据库】mysql数据库迁移前应如何备份数据?
  • shell脚本_永久环境变量和字符串操作
  • Redis基础篇
  • 前后端请求响应
  • 【WPF】Prism学习(三)
  • android framework ams/wms常见系统日志(main\system\events\crash,protoLog使用)
  • springmvc通过使用map来进行数据的接收和使用
  • 【python系列】python数据类型之字符串
  • uniapp h5 实现扫扫二维码
  • 排序算法 -快速排序
  • 【 LLM论文日更|检索增强:大型语言模型是强大的零样本检索器 】
  • Java基础-组件及事件处理(中)
  • 深度学习的艺术:揭秘卷积神经网络(CNN)的神秘面纱
  • Linux-何为CentOS
  • Unity3D中管理Shader效果详解
  • 算法定制LiteAIServer摄像机实时接入分析平台玩手机打电话检测算法:智能监控的新篇章
  • 基础:用卷积神经网络(CNN)进行猫狗图像分类
  • (四)P2Link内置HTTP服务,分享本地文件
  • 力扣515:在每个树行中找最大值
  • 云原生周刊:Istio 1.24.0 正式发布
  • css:盒子模型
  • 【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
  • React Native 全栈开发实战班 -原生功能集成之相机与图片
  • 希尔排序(C语言)
  • 基于STM32设计的大棚育苗管理系统(4G+华为云IOT)_265