首页 > 试题广场 >

以下代码编译有错误,哪个选项能解决编译错误?

[单选题]
以下代码编译有错误,哪个选项能解决编译错误?
class A {
    public:
        int GetValue() const {
            vv = 1;
            return vv;
         }
    private:
        int vv;
};
  • 改变成员变量"vv"为"mutable int vv"
  • 改变成员函数"GetValue"的声明,以使其不是const的
  • 都不能修复编译错误
  • 都可以修复编译错误
A编译依旧不通过。。
发表于 2018-11-26 11:26:53 回复(0)
更多回答
推荐
【正确答案】D
【解析】普通成员函数后面加上 const 修饰,就是常函数。
常函数中的 this 指针是常指针,不能在常函数中对成员变量进行修改,只能读取;
如果想要在常函数中对成员变量进行修改,可以在成员变量前加上 mutable 关键字进行修饰;
常函数可以被普通对象或者常对象调用,但是常对象只能调用常函数,常对象只能读成员。
 
常函数和常对象知识点讲解】
更多C++基础专业知识讲解,点击链接即可查看
https://www.nowcoder.com/link/zxyl-cpp41
编辑于 2021-11-17 15:54:09 回复(0)
这题,呵呵。
编译错误主要是GetValue是const成员函数,故vv = 1会报错
A和B都可以解决,所以选D。
发表于 2015-09-10 14:18:44 回复(0)
mutalbe的中文意思是“可变的,易变的”,跟constant(既 C ++中的const)是反义词。

在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。
编辑于 2021-11-17 15:54:09 回复(6)
在C++中,由const修饰的成员函数的函数体内部,是不能够对成员变量进行修改的
两个办法:指针或加mutalbe
发表于 2017-10-24 15:08:00 回复(0)
这题选C GetValue() 没有返回类型
发表于 2015-09-05 17:11:26 回复(5)
1.mutable定义可变成员对象(即使在带有const的成员函数中也可改变成员对象的值) 2.c++中类的成员函数都有隐含的this指针,普通的非const成员函数中,this是一个指向类类型的const指针,可改变this所指向的值,但不可以改变this所保存的地址;在const成员函数中,不可改变this所指向的值,也不可改变this保存的地址。因此,本题当去掉const时,可以改变成员对象的值。
发表于 2016-07-03 10:23:03 回复(3)
这题选D
发表于 2015-09-05 15:46:25 回复(2)

(1)const修饰成员变量
const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。
    class A
    { 
        …
        const int nValue;         //成员常量不能被修改
        …
        A(int x): nValue(x) { } ; //只能在初始化列表中赋值
     } 


(2)const修饰成员函数
const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。
    class A
    { 
        …
       void function()const; //常成员函数, 它不改变对象的成员变量.                        

//也不能调用类中任何非const成员函数。
}

对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。

a. const成员函数不被允许修改它所在对象的任何一个数据成员。

 

(3)const修饰类对象/对象指针/对象引用

  • const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。
  • const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。
    例如:
    class AAA

        void func1(); 
    void func2() const; 

    const AAA aObj; 
    aObj.func1(); ×
    aObj.func2(); 正确
    const AAA* aObj = new AAA(); 
    aObj-> func1(); ×
    aObj-> func2(); 正确
发表于 2018-06-08 16:33:39 回复(1)
mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
发表于 2021-02-18 15:22:54 回复(0)
B,const 函数不能重新赋值。
发表于 2016-04-12 21:47:02 回复(2)
在C++中,如果一个成员函数被声明为const,意味着该函数不能修改类的非静态成员变量。这是因为const成员函数被保证不会修改类的状态,从而使得类的对象能够在const上下文中使用。

如果你需要在const成员函数中修改成员变量,有两种方法可以解决这个问题:

1. mutable关键字:
   在C++中,可以使用mutable关键字修饰成员变量,这样即使在const成员函数中,也可以修改这些被mutable修饰的成员变量。mutable关键字的使用方法如下:
   ```cpp
   class MyClass {
   private:
       mutable int myVariable;
   
   public:
       void constFunction() const {
           myVariable = 10;  // 可以在const成员函数中修改被mutable修饰的成员变量
       }
   };
   ```

2. const_cast关键字:
   另一种解决方法是使用const_cast关键字,它可以将const属性去除,从而允许修改被const修饰的成员变量。但是,使用const_cast需要谨慎,因为它可能导致未定义的行为。使用const_cast的示例如下:
   ```cpp
   class MyClass {
   private:
       int myVariable;
   
   public:
       void constFunction() const {
           const_cast<MyClass*>(this)->myVariable = 10;  // 通过const_cast去除const属性,修改成员变量
       }
   };
   ```

需要注意的是,虽然上述方法可以在const成员函数中修改成员变量,但是在设计类时,应该遵循const成员函数不修改类的状态的原则,以保证代码的可读性和可维护性。只有在确实需要在const成员函数中修改成员变量的特殊情况下,才应该使用上述方法。
发表于 2023-09-11 19:56:56 回复(0)
补充一点mutable的实际用途

class A{
public:
    // func逻辑上是const的
    void func() const {
        // 加锁解锁会改变m_
        // 将锁声明为mutable可以正确加解锁,同时保持函数为const
        std::lock_guard<std::mutex> guard(m_);
        ...
    }
private:
    mutable std::mutex m_;
};



发表于 2020-03-16 18:04:00 回复(1)
我就奇了怪了,你这没有this指针,你哪来的vv
发表于 2021-03-12 19:52:42 回复(0)
第一次学C++的时候都没听说过有mutable这个关键字
发表于 2020-07-30 11:15:20 回复(0)
<p>mutable可变的,易变的,被该关键字修饰的变量即使在const函数中也可以改变</p>
发表于 2020-06-12 21:42:50 回复(0)
题出的有误区,mtable 和const相反,  c和d???
发表于 2019-09-16 13:40:46 回复(0)
mutalbe的中文意思是“可变的,易变的”,跟constant(既 C ++中的const)是反义词。
发表于 2017-08-29 20:53:57 回复(0)
没理解d选项中什么是都可以修复编译错误,它原来指的是a、b选项都可以。。
发表于 2017-03-02 21:10:38 回复(0)
怎么越来越浮躁了,看到B直接选了,看来是我太过自信了,唉
发表于 2016-09-04 15:17:45 回复(0)
用mutable vs下编译不通过。。。。
发表于 2016-07-28 09:36:27 回复(0)