首页
学习
活动
专区
工具
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=重载赋值函数返回选择哪种方式也是同样的方法

12710

六、类和对象

抽象只关注对象哪些属性和行为,并不关注这些行为的细节是什么。通过抽象,我们可以忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。...访问修饰符 在C++中,类的成员(包括成员变量和成员函数可以三种访问修饰符:public、protected和private。默认情况下,如果不指定访问修饰符,则成员的访问级别是private。...public:成员可以任何地方被访问。 protected:成员可以被其派生类(子类)和同一个包(在C++中,这通常指的是同一个类)中的其他成员访问。...{ return height; } }; 在这个例子中,Rectangle类两个私有成员变量width和height,以及几个公有成员函数,包括两个构造函数、计算面积和周长的方法,以及可能的setter...内存管理: 由于class是引用类型,所以在赋值或作为参数传递时,传递的是引用而非实际对象,这可能导致意外的数据共享和修改。

8010
  • ios 笔试题3

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

    72910

    类和对象(2)

    但是如果返回对象一个当前函数局部域的局部对象函数结束就销毁了,那么引用返回是问题的,相当于一个引用,类似一个野指针。...请思考下面的几个问题: 1. const对象可以调用非const成员函数?...编译器会阻止这种调用,以确保 const 对象的不可变性。 2. 非const对象可以调用const成员函数? 答案是肯定的。非 const 对象当然可以调用 const 成员函数。...非const成员函数可以调用其它的const成员函数?   答案是肯定的。非 const 成员函数内部可以自由地调用 const 成员函数。...这是因为 const 成员函数保证不会修改对象的任何成员变量,所以它们可以在任何情况下被安全调用,包括非 const 成员函数内部。

    9210

    用动画和实战打开 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.6K30

    浅谈 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,这样可以防止自己或者其它程序员误操作,当误更改了某些成员变量时,编译器会报错。...tips:const对象上只能调用const成员函数,非const对象上既可以调用非const成员函数,也可以调用const成员函数。 什么时候需要加noexcept?...这里抛砖引玉下,如果是服务端编程,建议使用异常处理替代错误码的错误处理方式,关于异常处理两个常见问题: 构造函数可以使用异常 析构函数可以使用异常

    1.5K20

    【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成员函数是安全的。

    9710

    【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作

    使用引用给实参取别名,指向对象共占用一块内存空间,就不需要拷贝数据去调用拷贝函数,减少拷贝次数 3.使用const修饰引用 使用const修饰的引用意味着我们不会修改传入的对象。...不能去重载运算符改变内置类型的行为) 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义 作为成员函数重载时,其形参看起来比操作数数目少一个,因为成员函数的第一个参数为隐藏的this...非const对象可以调用const成员函数const成员函数可以调用其他的非const成员函数? 非const成员函数可以调用其他的const成员函数?...(不可以,权限放大) 非const对象可以调用const成员函数?(可以,权限缩小) const成员函数可以调用其他的非const成员函数?...(不可以,权限放大) 非const成员函数可以调用其他的const成员函数

    11200

    KVO详解(二)

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

    71331

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

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

    19010

    全面了解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

    3.3K10

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

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

    2.9K30

    C++拷贝构造函数

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

    2K80

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

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

    29510

    C++:类与对象(2)

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

    12910
    领券