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

我们可以有一个setter成员函数作为const从const对象引用吗?

在C++中,const成员函数表示该函数不会修改对象的状态。而setter函数通常用于修改对象的状态,因此通常不应该将setter函数声明为const成员函数。

如果将setter函数声明为const成员函数,编译器会报错,因为const成员函数保证不会修改对象的状态,而setter函数的目的就是修改对象的状态。

以下是一个示例代码:

代码语言:txt
复制
class MyClass {
private:
    int value;

public:
    void setValue(int newValue) {
        value = newValue;
    }

    int getValue() const {
        return value;
    }
};

int main() {
    const MyClass obj;
    obj.setValue(10); // 编译错误,const对象不能调用非const成员函数
    int val = obj.getValue(); // 可以调用const成员函数
    return 0;
}

在上述示例中,尝试在const对象上调用非const的setValue函数会导致编译错误。而调用const的getValue函数是允许的,因为const成员函数保证不会修改对象的状态。

总结起来,不应该将setter函数声明为const成员函数,因为setter函数的目的是修改对象的状态,而const成员函数保证不会修改对象的状态。

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

相关·内容

C++奇迹之旅:深入理解赋值运算符重载

Date& d1, const Date& d2) 重载成全局,无法访问私有成员,解决办法三种: 使用 getter 和 setter 函数的方案: class Date { public:...用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义 作为成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐 藏的this .* :: sizeof..._day; } return *this; } 因此我们总结一下赋值运算符重载格式 参数类型:const T&,传递引用可以提高传参效率 返回值类型:T&,返回引用可以提高返回的效率,返回值目的是为了支持连续赋值...{ const Date& ref = func(); return 0; } 总结一下:返回对象一个局部对象或者临时对象,出了当前func函数作用域,就析构销毁了,那么不能用引用返回用引用返回是存在风险的...,因为引用对象在func函数栈帧已经销毁了 虽然引用返回可以减少一次拷贝,但是出了函数作用,返回对象还在,才能用引用返回 理解了func函数,那么operator=重载赋值函数返回选择哪种方式也是同样的方法

9910

ios 笔试题3

这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等...; (3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值; (4)对于类的成员函数,若指定其为 const 类型,则表明其是一个函数,不能修改类的成员变量...; (5)对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。...; 一个参数既可以const可以是volatile?解释为什么。  ?; 一个指针可以是volatile ?解释为什么。  下 面是答案:  ?; 是的。一个例子是只读的状态寄存器。...成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; (5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

68910

用动画和实战打开 React Hooks(二):自定义 Hook 和 useCallback

再来看看重渲染的情况: 同样地,即便代码的执行进入到自定义 Hook 中,我们依然可以 Hook 链表中读取到相应的数据,这个”配对“的过程总能成功。 我们再次回味一下 Rules of Hook。...我们首先来实现一个自定义 Hook,名为 useCoronaAPI ,用于共享 NovelCOVID 19 API 获取数据的逻辑。...在大多数情况下,我们都是传入空数组 [] 作为 deps 参数,这样 useCallback 返回的就始终是同一个函数,永远不会更新。...提示 你也许在刚开始学习 useEffect 的时候就发现:我们并不需要把 useState 返回的第二个 Setter 函数作为 Effect 的依赖。...useCallback 和 useMemo 的关系 我们知道 useCallback 个好基友叫 useMemo。还记得我们之前总结了 Memoization 的两大场景

1.5K30

如何设计一个C++的类?

默认的构造函数不会给我们的数据成员初始化,所以需要自己写一个构造函数,其实在构造函数里的语句也不能称之为初始化,那是个赋值操作,真正的初始化可以通过初始化列表方式或者声明成员时直接给初值,类似下面的代码...如果我们的类指针数据成员我们在某个地方为其分配了一块内存,编译器自动生成的析构函数默认是不会将这块内存释放掉的,为了规避这潜在的风险,还是自己写一个吧!...其实不标const也不会有任何问题,但是如果我们期望某个函数内不会修改任何成员变量时,应该把该成员函数标记为const,这样可以防止自己或者其它程序员误操作,当误更改了某些成员变量时,编译器会报错。...tips:const对象上只能调用const成员函数,非const对象上既可以调用非const成员函数,也可以调用const成员函数。 什么时候需要加noexcept?...这里抛砖引玉下,如果是服务端编程,建议使用异常处理替代错误码的错误处理方式,关于异常处理两个常见问题: 构造函数可以使用异常 析构函数可以使用异常

1.5K20

浅谈 Objective-C Associated Objects

id object); 从上面可以看出, objc_setAssociatedObject 用于给对象添加关联对象,传入 nil 则可以移除已有的关联对象; objc_getAssociatedObject...key:唯一标记,即可以使用 static char 作为 key 值,也可以使用 static void *kAssociatedObjectKey 指针作为 key 值,当然推荐使用 用 selector...,使用 getter 方法的名称作为 key 值,可以利用 _cmd 来方便的取出 selector。...注意:objc_removeAssociatedObjects这个方法会移除一个对象的所有关联对象,一般通过给 objc_setAssociatedObject 函数传入 nil 来移除某个已有的关联对象...注意:OBJC_ASSOCIATION_ASSIGN 弱引用关联对象,一般修饰词为 assign、unsafe_unretained 和 weak 区别,当对象销毁时,指针的地址还是存在的,也就是说指针并没有被置为

1K30

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

const对象可以调用const成员函数? 非const对象可以调用const成员函数const成员函数的主要目的是确保函数不会修改对象的状态。...3. const成员函数可以调用其它的非const成员函数? 不可以。在const成员函数中,不能直接调用同一个类的非const成员函数。...然而,一种情况可以间接调用非const成员函数,那就是如果你将对象const性质通过const_cast去除,然后调用非const成员函数。...总结来说,const成员函数内不能直接调用非const成员函数,以保持const成员函数的承诺不修改对象状态。 4. 非const成员函数可以调用其它的const成员函数?...因此,逻辑上讲,在可以修改对象状态的非const成员函数中调用一个不会修改对象状态的const成员函数是安全的。

8010

【c++】类和对象(五)赋值运算符重载

赋值运算符重载通常返回对象引用,并接收一个对同类对象的常引用作为参数 我们接下来讲解赋值运算符重载的具体实现来体现上面的特点: 能不能直接这么写呢?...,因此只能以值的方式返回,不能返回引用 2.const成员函数 假如我们现在定义一个const对象,想访问它的Print函数我们发现是调用不了的: class Date { public: Date...,这里是权限的缩小 请思考下面的几个问题: const对象可以调用非const成员函数?...不可以,权限放大 非const对象可以调用const成员函数可以,权限缩小 const成员函数可以调用其它的非const成员函数?...不可以,权限放大 非const成员函数可以调用其它的const成员函数

15110

KVO详解(二)

然后在分类中去增加一个自定义的添加观察者的方法,在该方法中,大致是做三件事情: 验证观察的keyPath是否对应的setter方法,有的话才会进行下一步 创建一个中间类 修改实例对象的isa指针的指向...我们前面提到,当一个对象在被KVO监测之后,其isa指针会指向一个新的中间子类,因此,在移除KVO观测的时候,我们就需要将isa给指回来: ?...添加观察者 1,首先,要检查一下传入的keyPath是否对应的setter,如果没有的话,说明是成员变量,此时无法KVO,报出异常;如果有setter,那么就进入下一步。...移除观察者 里面做的最重要的一件事就是将实例对象的isa指针的指向给改回来。 自定义KVO优化——函数式编程 现在各位想一下,我们实现一个KVO的监听,需要做哪些步骤呢?...这样一改造之后,在外界使用的时候,KVO观察者的添加和KVO变化的监听就可以一起写了,而不必分开写了: ? 一个循环引用的小问题 接下来说一个小点: ?

67531

全面了解Vue3的 ref 和相关函数和计算属性

于是了这个语法糖。 toRef 和 toRefs toRef 可以用来为源响应式对象上的 property 性创建一个 ref。...其实,说是变成了ref,但是我们看看打印结果就会发现,其实并不完全是ref。 ? ? 看类名和属性,toRef 和 ref 也是区别的。 toRef 为啥可以响应 toRef 也是一个语法糖。...它需要一个工厂函数,该函数接收 track 和 trigger 函数作为参数,并应返回一个带有 get 和 set 的对象。 如果上面那段没看懂的话,可以跳过。...这样就可以了,延迟多长的时间可以自定义,这里是一秒。一秒内用户输入的内容,会一次性更新,而不是每输入一个字符就更新一次。 v-model="text" 可以作为 v-model 来使用。..._setter(newValue); } } computed 暴露给我们用的方法,来定义一个计算属性。只有一个参数,可以一个函数(function),也可以一个对象

1.4K30

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

可以应用于简单的值、指针及指针所指的内容,也可以作为一个特别的属性应用于类的成员函数上,表示成员函数不能修改对象的状态。...让我们看一下在Qt的API设计中与const相关的场景。 4.3.1 输入参数:const指针 输入指针参数的const成员函数,几乎总是const指针参数。...问题起源是:const函数本身不能修改对象自身的状态,却可以返回成员的非const指针。返回指针这个简单动作本身既不会影响整个对象的可见状态,当然也不会改变这个函数职责范围内涉及的状态。...(以d-point的典型做法(idiom)为例,我们可以在任何时候改变Qt类在内存表示(memory representation);但却不能在不破坏二进制兼容性的情况下把改变函数的签名,返回值const...函数命名的第一准则是可以函数名看出来此函数是否副作用。

2.7K20

Dart 中 final 和 const 区别

final只是要求变量在初始化后值不变,但通过final,我们无法在编译时(运行之前)知道这个变量的值;而const所修饰的是编译时常量,我们在编译时就已经知道了它的值,显然,它的值也是不可改变的。...,即:非const修饰的变量(只有const修饰的变量才是编译时常量) const可以用来声明常量值: // [] 创建一个空列表. // const [] 创建一个空的不可变列表 (EIA). var...高级使用 当为final修饰的值赋一个包含成员变量或方法的对象时: 对象成员值能被修改,对于能够添加成员的类(如List、Map)则可以添加或删除成员 变量本身实例不能被修改 class Point{...和[1,2,3,4]是不同的对象 baz[0]=2; //正常执行,只修改了变量引用对象成员变量的值 print(baz); final bad = []; //...List bad.add(1); //正常执行,向变量引用对象添加成员 bad.add(2); print(bad) final Map<String, String

3K10

C++拷贝构造函数

调用拷贝构造函数的情形 在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”): 1) 一个对象作为函数参数,以值传递的方式传入函数体; 2) 一个对象作为函数返回值,以值传递的方式函数返回...拷贝构造函数的格式为:类名(const 类名& 对象名);//拷贝构造函数的原型,参数是常量对象引用。由于拷贝构造函数的目的是成员复制,不应修改原对象,所以建议使用const关键字。...防止默认拷贝发生     通过对对象复制的分析,我们发现对象的复制大多在进行“值传递”时发生,这里一个小技巧可以防止按值传递——声明一个私有拷贝构造函数。...其时名子我们就知道拷贝构造函数其时就是一个特殊的构造函数,操作的还是自己类的成员变量,所以不受private的限制。 2. 以下函数哪个是拷贝构造函数,为什么?...一个类中可以存在多于一个的拷贝构造函数? 解答:类中可以存在超过一个拷贝构造函数

1.9K80

C++入门到精通——类的6个默认成员函数之拷贝构造函数

拷贝构造函数 前言 一、拷贝构造函数概念 理解 定义 二、拷贝构造函数的特征 三、注意要点 写法 实践 前言 类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有?...class Date {}; 一、拷贝构造函数概念 理解 在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。 那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?...C++拷贝构造函数是一种特殊的构造函数,用于创建对象时,使用一个已有对象的内容来初始化新的对象。它接受一个同类对象作为参数,并按照该对象的数据成员的值来创建新的对象。...拷贝构造函数的工作原理是将obj的数据成员的值复制给新创建的对象。这意味着新对象的数据成员会与原对象具有相同的值,但是它们是独立的,改变其中一个对象的数据成员的值不会影响另一个对象的数据成员。...拷贝构造函数的参数只有一个且必须是类类型对象引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

23510

Dart的语法详解系列篇(二)-- 类与函数八、Dart的类与函数

基于Mixin的继承意味着虽然每个类(除了Object)只有一个超类,但是类体可以在多个类层次结构中重用。 (一)使用类成员 对象具有由函数和数据(分别为方法和实例变量)组成的成员。...调用方法时,使用点(.)来引用实例变量或方法,可以对象上调用它:可以访问该对象函数和数据。...您可以使用静态方法作为编译时常量。例如,您可以将静态方法作为参数传递给常量构造函数。 (六)构造函数 通过创建一个与其类同名的函数来声明构造函数(另外,还有一个额外的标识符,如命名构造函数中所述)。...可以通过函数指定变量或者把函数作为其他函数的参数。 (1)函数的简写。 1.对于只有一个表达式的函数可以简写。...'这是一个函数别名的使用Demo'); // }, // 先写一个函数,然后再引用进来就可以了 mFunction: test(), ); } // 1.

2.8K30

C++:类与对象(2)

通过上图我们可以得到结论:  默认构造函数对 (1)内置类型成员不处理 (2)自定义类型成员,调用他的析构函数 思考: 1、对于构造函数我们会想办法对他的内置类型初始化,那析构函数需要对内置类型需要处理...答:析构函数并不是对对象本身进行销毁,因为对象本身作为一个局部变量,在函数结束后会自动被回收的,所以析构函数本质上是对对象的资源进行清理,什么叫做资源呢?...所以了 拷贝构造函数 4.1 概念 拷贝构造函数:只有单个形参,该形参是对本类类型对象引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。...3、为什么概念里提到,对本类类型对象引用一般用const修饰?什么好处?...注意: 1、非const对象可以调用const或者是非const成员函数,而const对象只能调用const成员函数,其实总的来说就是权限可以变小、可以平移,就是不能放大 2、使用建议:内部不改变成员变量的成员函数最好加上

10810

类与对象中篇

return 0; } 赋值运算符重载: 1.赋值运算符重载格式:    参数类型:const T&,传递引用可以提高传递效率    返回值类型:T&,返回引用可以提高返回的效率,返回值的目的是为了支持连续赋值...不可以const Date* d1 —>  Date* const this  权限放大 2.非const对象可以调用const成员函数?...可以,Date* d1 —>  const Date* const this 权限缩小 3.const成员函数可以调用其他的非const成员函数?...不可以const成员函数内不可以调用其他的非const成员函数功能角度,是不想存在修改成员变量的风险,语法角度,this -> test2()  const Date* const this -...>Date* const this 权限放大 4非const成员函数可以调用其他的const成员函数

50430

剖析【C++】——类与对象(中)——小白篇—超详解

它的参数是对本类类型对象引用,通常用 const 修饰。 示例类:Date 假设我们一个 Date 类,通过拷贝构造函数可以创建一个与已存在对象相同的新对象。...示例类:Stack 假设我们一个 Stack 类,通过赋值运算符重载可以定义对象之间的赋值操作。...通过以下问题的解答,我们可以深入理解const成员函数的行为。 问题1: const对象可以调用非const成员函数? 不可以。...因为非const成员函数可能会修改对象的状态,而const对象保证其状态不会被改变。 问题2: 非const对象可以调用const成员函数可以。...const成员函数不会修改对象的状态,因此非const对象可以调用它。 问题3: const成员函数可以调用其它的非const成员函数? 不可以

8910

C++的拷贝构造函数

前言 类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。...默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 class Date {}; 一、拷贝构造函数概念 理解 在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。...C++拷贝构造函数是一种特殊的构造函数,用于创建对象时,使用一个已有对象的内容来初始化新的对象。它接受一个同类对象作为参数,并按照该对象的数据成员的值来创建新的对象。...拷贝构造函数通常用于以下情况: 在创建对象时,使用同类已有对象的值来初始化新对象。 以值传递方式将对象传递给函数。 以值返回方式函数返回对象。...拷贝构造函数的工作原理是将obj的数据成员的值复制给新创建的对象。这意味着新对象的数据成员会与原对象具有相同的值,但是它们是独立的,改变其中一个对象的数据成员的值不会影响另一个对象的数据成员

3900
领券