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

如果成员函数影响逻辑状态,而不是按位状态,那么它们应该是"const"吗?

这个问题涉及到C++编程语言中的成员函数和const关键字。在C++中,成员函数可以被声明为const,这表示该函数不会修改对象的状态。如果一个成员函数不会修改对象的逻辑状态,那么它应该被声明为const。这样做的好处是可以提高代码的可读性和安全性,因为其他程序员可以清楚地看到哪些函数可以修改对象的状态,哪些函数不会修改对象的状态。

例如,假设我们有一个表示二维点的类,如下所示:

代码语言:cpp
复制
class Point {
public:
    Point(double x, double y) : x_(x), y_(y) {}

    double x() const {
        return x_;
    }

    double y() const {
        return y_;
    }

    Point operator+(const Point& other) const {
        return Point(x_ + other.x_, y_ + other.y_);
    }

private:
    double x_;
    double y_;
};

在这个例子中,x()和y()成员函数被声明为const,因为它们不会修改对象的状态。而operator+()函数也被声明为const,因为它不会修改当前对象的状态,而是返回一个新的Point对象。

总之,如果一个成员函数不会影响对象的逻辑状态,那么它应该被声明为const,以提高代码的可读性和安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载

后置运算符的关键在于返回操作前的状态。 安全性:返回拷贝还避免了潜在的外部修改,此时得到的是一个独立的值,而不是对原始数据的直接引用。原始数据没有影响。...非const对象可以调用const成员函数吗? 非const对象可以调用const成员函数。 const成员函数的主要目的是确保函数不会修改对象的状态。...原因是const成员函数承诺不会修改对象的状态,而如果它调用了非const成员函数,就会违背这个承诺,因为非const成员函数可能会修改对象。...总结来说,const成员函数内不能直接调用非const成员函数,以保持const成员函数的承诺不修改对象状态。 4. 非const成员函数内可以调用其它的const成员函数吗?...因此,从逻辑上讲,在可以修改对象状态的非const成员函数中调用一个不会修改对象状态的const成员函数是安全的。

10310

翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 6 章:值的不可变性

如果编程风格幂等性是指定义一个数据变更操作以便只影响一次程序状态,那么现在我们将注意力转向将这个影响次数从 1 降为 0。 现在我们开始探索值的不可变性,即只在我们的程序中使用不可被改变的数据。...但在开始之前应该心中有数:值的不可变性并不是说我们不能在程序编写时不改变某个值。如果一个程序的内部状态从始至终都保持不变,那么这个程序肯定相当无趣!它同样不是指变量不能承载不同的值。...想象一下,如果你的确允许 magicNums 这个变量所引用的数组被修改,那么这个 const 关键词就极具混淆性了 —— 的很确容易发生意外,不是吗?...如果你使用 const 声明变量来保存引用吗,这个变量的确没法被重新赋值了,那么……然后呢? 从这方面来讲,我认为 const 反而增加了函数式编程的困难度。我的结论是:const 并不是那么有用。...因为一些性能面的原因,某些场景下你仍然可能会用到它们。不过你也应当注意,如果一个数组没有被本地化在当前函数的作用域内,那么不应当使用这些方法,避免它们所产生的副作用影响到代码的其他部分。

1.2K50
  • 闭关多日,整理一份C++中那些重要又容易忽视的细节

    对象数据很小,按值传递即可。 对象是数组,指针。这是唯一的选择,并将指针声明为指向const的指针。 数据对象是较大的结构,使用const指针或const引用,提高程序效率。...数据对象是类对象,使用const引用。类设计的语义常常要求使用引用,因此,在传递类对象参数的标准方式是按引用传递。 对于修改调用函数中数据的函数: 如果数据对象是内置数据类型,使用指针。...(逻辑非) 单目运算符 + (正),-(负),*(指针),&(取地址) 自增自减运算符 ++(自增),–(自减) 位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,如果基类的析构函数不是虚函数,在delete p时,调用析构函数时,只会看指针的数据类型,而不会去看赋值的对象,这样就会造成内存泄露。...另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。

    59410

    Qt 常用类 (9)—— QWidget

    独立窗口        窗口构造的时候如果有 Qt::Window 标志,那么它就是一个独立窗口,否则就是一个依附于其他独立窗口的窗口部件。...这里要注意的是,setVisible 函数实际上设置的是窗口是否隐藏,而不是可见性。可见性与隐藏有如下关系。         1)隐藏的窗口一定是不可见的。        ...5)Qt::WindowActive:激活状态。         这里取值可以用 “按位或” 的方式组合起来使用。        ...disable),这是一个槽           其中两个设置属性的函数同时也是槽。窗口的使能状态也可能影响外观,比如处于禁用状态的按钮文本本身为灰色。        ...注意,对于鼠标移动事件 QMouseEvent 和 button 函数总是返回 Qt::NoButton,而 buttons 函数返回值则是 Qt::MouseButton 类型的 “按位或” 组合,它能反映事件发生时鼠标键的按下状态

    3.6K10

    代码10倍提速!吃透底层架构就是如此简单

    检查类型,以及一些 debug 断点了: 从前面的 Tagged Pointer 的相关讨论可知,L19 ~ L22 其实就是在判断入参是不是 SMI,具体来说是 [rbx+0xf] 与 0x1 做按位与操作...但是如果按这个设计,下面两个 obj 就会有重复的 key 定义内存消耗了: const obj1 = { x: 11, y: 22 } // "x" 11 "y" 22 const obj1 = {...是的,如果事先不知道 JSObject 的 shapes 的情况下去读取成员确实是 O(n) 的,但前面我已经提过了: V8 的诸多优化是基于 assumption 的,那么在已知 obj 的 Shapes...将项目里的一些高频原子操作拆成独立函数,人为制造热点代码,比如计算点距离,单位换算等等这些需要高性能的地方: 10.2 函数拆解 除了前面提到的热区之外,拆解后的函数如果足够短,那么 V8 在调用的时候会做...10.3 减少函数状态(Mono) 从前面的 add 的例子我们可以知道,V8 TurboFan 优化是基于 assumption 的,应该尽量保持函数的单态性 (Monomorphic),或者说减少函数的状态

    84722

    极速优化:十倍提升JS代码运行效率的技巧

    五、V8 基于 assumption 的 JIT 机器码优化 我们先来看这个例子,一个 add(x,y) 函数,如果运行期间出现了多种类型的传参,那么会导致代码变慢: 我们可以看到,L15 速度慢了非常多...检查类型,以及一些 debug 断点了: 从前面的 Tagged Pointer 的相关讨论可知,L19 ~ L22 其实就是在判断入参是不是 SMI,具体来说是 [rbx+0xf] 与 0x1 做按位与操作...是的,如果事先不知道 JSObject 的 shapes 的情况下去读取成员确实是 O(n) 的,但前面我已经提过了: V8 的诸多优化是基于 assumption 的,那么在已知 obj 的 Shapes...函数拆解 除了前面提到的热区之外,拆解后的函数如果足够短,那么 V8 在调用的时候会做 inline 展开优化,节省一次调用栈开销。 3....减少函数状态(Mono) 从前面的 add 的例子我们可以知道,V8 TurboFan 优化是基于 assumption 的,应该尽量保持函数的单态性 (Monomorphic),或者说减少函数的状态,

    78850

    嵌入式笔试面试题目系列(汇总)

    2)用const修饰形参:func(const int a){};该形参在函数里不能改变 3)用const修饰类成员函数:该函数对成员变量只能进行只读操作,就是const类成员函数是不能修改成员变量的数值的...全局变量不受作用域的影响(也就是说,全局变量的生命期一直到程序的结束)。 局部变量:出现在一个作用域内,它们是局限于一个函数的。...是一个操作符,也是关键字,就不是一个函数,这和strlen()不同,strlen()是一个函数。 那么sizeof的作用是什么?返回一个对象或者类型所占的内存字节数。...占8,函数指针占8个,由于是64位编译是8字节对齐(说明:按几字节对齐,是根据结构体的最长类型决定的,这里是函数指针是最长的字节,所以按8字节对齐)所以该结构体占24个字节。...64位操作系统下的虚拟内存空间大小:地址空间大小不是2^32,也不是2^64,而一般是2^48。因为并不需要2^64那么大的寻址空间,过大的空间只会造成资源的浪费。

    5.4K105

    React Hooks 底层解析

    一想到 hooks 时它们似乎是某种魔法,React 以某种甚至不用暴露其实例(起码没有用到这个关键词)的手段管理了你的组件。那么 React 究竟捣了什么鬼呢?...它们之所以表现成这样是因为 hooks 并非被简单的创建后就独自行事了。有一个允许它们按身份行事的机制。...这意味着当你已经把 state setter 发往组件树后仍可改变父组件的当前状态,而不用向其传入一个不同的 prop。...再说一次,在我深入解释实现之前,希望你记住关于 effect hooks 属性的一些事情: 它们在渲染时被创建,但在绘制(painting)之后才运行 如果存在,它们会在下次绘制之前才被销毁 按定义的顺序被调用...注意我使用了术语 “painting” 而不是 “rendering”。

    77610

    CC++面试必备知识

    编译器为每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。...如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。如果在 32 位的机器下,一个int类型的地址为0x00000004,那么它就是自然对齐的。...两个结构体包含同样的成员,但是却相差 8 个字节。难道我们只需要通过简单的指令就能完成内存对齐的工作吗?其实不是的。上面的对齐结果如下: 以 32 位机器为例,CPU 取的字长是 32 位。..._Size是字节数,也就是说如果是32位数组,两个数组值就应该是_Size就应该是4。...另外,如果第7行不初始化为NULL,编译时不会报错,但是,它就成了野指针野指针野指针啊,操作野指针是很危险的; 一级指针传递的函数内部更改不影响实参一级指针的值,所以此处要么使用二级指针,要么使用引用。

    22930

    《C++Primer》第十四章 重载运算与类型转换

    ,所以我们一般也不重载它们 一般情况下不重载逗号、取地址、逻辑与和逻辑或运算符 我们定义重载的运算符时,必须首先决定它是声明为类的成员函数还是声明为一个普通的非成员函数: 赋值=、下标[]、调用(...,例如算术、相等性、关系和位运算符等,因此它们通常应该是普通的非成员函数 输入和输出运算符 IO库分别使用>>和而类需要自定义适合其对象的新版本呢以支持...如果类重载了函数调用运算符,那么我们可以像使用函数一样使用该类的对象,因为这样的类同时也能存储状态,所以与普通函数相比它们更加灵活。...默认情况下lambda不能改变它捕获的变量,因此在默认情况下由lambda产生的类当中的调用运算符是一个const成员函数,如果lambda被声明为可变的,那么调用运算符就不是const的了。...,用户可能会感觉比较意外,而不是感觉受到了帮助。

    92810

    API设计原则 – QT官网的设计实践总结

    如果一个成员函数放在错误的类中,那么这个函数的潜在用户就会找不到,这也是违反完备性的。...所以,如果对像的构造比较重的话(换句话说,就是对像里的成员变量需要的内存比较大),这就会影响很多性能。所以,为了提高性能,最好是传引用。但是如果传入引用的话,会导致这个对象可能会被改变。...问题起源是:const函数本身不能修改对象自身的状态,却可以返回成员的非const指针。返回指针这个简单动作本身既不会影响整个对象的可见状态,当然也不会改变这个函数职责范围内涉及的状态。...但通用准则是const函数不能改变类的可见状态。『状态』的意思是『自身以及涉及的职责』。这并不是指非const函数能够改变自身的私有成员,也不是指const函数改变不了。...在Qt 3中,const函数QString::simplifyWhiteSpace()违反了此准则,因为它返回了一个QString而不是按名称暗示的那样,改变调用它的QString对象。

    2.7K20

    React Hooks 还不如类?

    它们更像是魔法,而且过多地依赖约定而不是严格的语法。...很难在组件之间重用有状态逻辑 React 没有提供一种将可重用行为“附加”到组件的方法(例如,将其连接到一个存储)……React 需要更好的原语来共享状态逻辑。 很讽刺不是吗?...另外,hooks 只能解决按实例逻辑共享的问题,但如果要在多个实例之间共享状态,则仍然需要使用存储和第三方状态管理解决方案;而且正如我之前所说,如果已经用上它们了,那其实就用不着 hooks 了。...[……]hooks 使你可以根据各个部分的相关性(例如设置订阅或获取数据)来将一个组件拆分为一些较小的函数,而不是根据生命周期方法强行拆分。 如果你在使用存储,那么上面这段话基本没意义。...好吧,但这并不是事实。 类有很多缺点,但 Funclass 的缺陷更加突出。正如我在文章开始时说过的,类是一个概念,而不是语法。还记得那些可怕的原型语法吗?它们用最尴尬的方式达成了和类一样的目标。

    84110

    九、运算符重载

    这有助于减少因理解代码逻辑而产生的认知负担。 便于集成和扩展: 当使用第三方库或框架时,如果它们支持运算符重载,那么我们的代码就可以更加无缝地与之集成。...特定运算符的重载方式: 某些运算符如=、()、[]和->只能通过成员函数进行重载,因为它们需要访问类的内部状态。...,但注意逻辑运算符的重载较为少见且需谨慎使用)、位运算符(如&、|、^、~、>)、赋值运算符(如=、+=、-=等复合赋值运算符)以及成员访问运算符(通过成员函数重载,但实际上是[]、()和->)...对于需要访问类内部状态的运算符(如赋值运算符=、下标运算符[]等),通常将它们重载为成员函数。...然而,需要注意的是,这些后缀是附加在字面量上的,而不是字面量之后的独立部分,因此它们并不完全符合传统意义上的“后缀重载”概念,后者可能指的是在函数调用或表达式之后添加后缀来改变其行为。

    16110

    类和对象(万字总结!深度总结了类的相关知识)(上)

    5.2 类作用域中的静态成员 类的静态成员变量和静态成员函数有特殊的作用域,它们属于类本身,而不是某个具体的对象。也就是说,无需实例化对象即可访问类的静态成员。...这意味着类的实际大小可能是 8 字节而不是 5 字节。 7.3 空类的大小 在C++中,即使类中没有任何成员变量,空类的大小也不是 0。...最终的 Derived 类大小应该是 Base 的大小加上 double b 的大小。 7.5 虚函数对类大小的影响 类中的虚函数会增加类的大小。...; 8.5 静态成员函数中没有this指针 静态成员函数:静态成员函数属于类本身,而不是某个具体的对象。...它在区分局部变量和成员变量、实现链式调用以及避免自我赋值中起到了重要作用。对于const成员函数,this指针为const指针,不能修改对象状态,而静态成员函数没有this指针。

    9510

    嵌入式笔试面试题目系列(二)

    2)用const修饰形参:func(const int a){};该形参在函数里不能改变 3)用const修饰类成员函数:该函数对成员变量只能进行只读操作,就是const类成员函数是不能修改成员变量的数值的...全局变量不受作用域的影响(也就是说,全局变量的生命期一直到程序的结束)。 局部变量:出现在一个作用域内,它们是局限于一个函数的。...是一个操作符,也是关键字,就不是一个函数,这和strlen()不同,strlen()是一个函数。 那么sizeof的作用是什么?返回一个对象或者类型所占的内存字节数。...占8,函数指针占8个,由于是64位编译是8字节对齐(说明:按几字节对齐,是根据结构体的最长类型决定的,这里是函数指针是最长的字节,所以按8字节对齐)所以该结构体占24个字节。...一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。

    71530

    【C++ 类和对象 进阶篇】—— 逻辑森林的灵动精灵,舞动类与对象的奇幻圆舞曲

    如果这个成员变量没有默认构造函数,那么就会编译出错,我们要初始化这个成员变量,需要用初始化列表!...传递方式:拷贝构造函数通常使用按引用传递对象,而不是按值传递,防止出现不必要的递归调用。...成员函数 定义: const 成员函数是指那些不会修改对象状态的成员函数。...计数器:在一些只读操作中(如访问次数计数器),需要更新计数器而不影响对象的逻辑状态。 延迟计算:可以用于延迟计算或懒加载(lazy loading)等操作。...const成员函数的约束:mutable 使得 const成员函数能够修改成员变量,但不会改变对象的外部状态。它仍然保持对象的“逻辑不可变性”,但允许修改内部的、仅对函数内部有意义的数据。

    3600

    React Hooks

    如果有多个操作,每个操作应该写成一个单独的函数。而且,数据的状态应该与操作方法分离。 根据这种理念,React 的函数组件只应该做一件事情:返回组件的 HTML 代码,而没有其他的功能。...组件的最佳写法应该是函数,而不是类。 副作用是什么?...2、useContext():共享状态钩子 ---- 如果需要在组件之间共享状态,可以使用 useContext()。 现在有两个组件 A 和 B,我们希望它们之间共享状态。...数组的第一个成员是状态的当前值,第二个成员是发送 action 的 dispatch 函数。 下面是一个计数器的例子。用于计算状态的 Reducer 函数如下。...④ 返回值 副作用是随着组件加载而发生的,那么组件卸载时,可能需要清理这些副作用。 useEffect() 允许返回一个函数,在组件卸载时,执行该函数,清理副作用。

    2.1K10

    类和对象(2)

    const 对象不能调用非 const 成员函数,因为非 const 成员函数可能会修改对象的内部状态,而 const 对象保证在其生命周期内不会被修改。...const 成员函数保证不会修改对象的任何成员变量(至少不通过显式的方式),但这并不阻止非 const 对象调用它们。...这提供了一种方式来提供对对象状态的只读访问,同时仍然允许非 const 对象进行其他可能的修改。 3. const成员函数内可以调用其它的非const成员函数吗? 答案是否定的。...如果 const 成员函数需要调用另一个函数,并且该函数可能修改成员变量,那么它应该调用另一个 const 成员函数,或者通过某种方式(如使用指针或引用指向非 const 对象)绕过 const 约束(...这是因为 const 成员函数保证不会修改对象的任何成员变量,所以它们可以在任何情况下被安全调用,包括从非 const 成员函数内部。

    9410

    快速了解 React Hooks 原理

    我们大部分 React 类组件可以保存状态,而函数组件不能? 并且类组件具有生命周期,而函数组件却不能?...函数组件转换为类组件的过程中大概有5个阶段: *否认:也许它不需要是一个类,我们可以把 state 放到其它地方。 实现: 废话,必须把它变成一个class,不是吗? 接受:好吧,我会改的。...搜索代码useWhatever并以某种方式用有状态逻辑替换它。 然后再听说了调用顺序规则(它们每次必须以相同的顺序调用),这让我更加困惑。这就是它的工作原理。...React第一次渲染函数组件时,它同时会创建一个对象与之共存,该对象是该组件实例的定制对象,而不是全局对象。只要组件存在于DOM中,这个组件的对象就会一直存在。...使用该对象,React可以跟踪属于组件的各种元数据位。 请记住,React组件甚至函数组件都从未进行过自渲染。它们不直接返回HTML。

    1.4K10
    领券