代码之家  ›  专栏  ›  技术社区  ›  nacho4d

c++中的const和no const方法?

  •  5
  • nacho4d  · 技术社区  · 14 年前

    operator const char* () const;
    operator char* ();
    void Save(const char *name) const;
    void Load(const char *name);
    

    第一:方法声明末尾的const是什么意思?,和放在开头一样吗?

    提前谢谢。

    8 回复  |  直到 14 年前
        1
  •  2
  •   Graham Perks    14 年前

    最后的“const”告诉编译器此方法不会更改任何成员变量-在const实例上调用此方法是安全的。因此,可以对const实例调用Save,因为它不会更改该实例。另一方面,Load将更改实例,因此不能在const实例上使用。

    operator()的const版本传回一个const指针,保证传回的缓冲区不会改变。可能是指向类的实例变量的指针。对于非常量实例,other运算符()将返回一个非常量指针。它必须是指向某个内存的指针,即使写入该内存,也不会更改实例的内容。

    还有,找时间查一下“mutable”关键字。理解这一点将有助于理解const正确性的概念。

        2
  •  8
  •   sepp2k    14 年前

    第一:方法声明末尾的const是什么意思?,和放在开头一样吗?

    不,A const 最后意味着可以对声明的对象调用该方法 . 一个 常量 常量 .

    非常量版本返回 char* 字符* 实际上,您可以修改对象(假设 字符* 是对象的成员)。

    因为这是不允许的 常量 对象,有一个 operator() 对于常量对象,以便 const char* 返回,因此无法通过它修改对象。

        3
  •  2
  •   DanDan    14 年前

    (*)-另请参见关键字mutable。

        4
  •  1
  •   JaredPar    14 年前

    const 在方法声明的末尾声明对象本身,或者 this ,是 常量 而不是返回类型。

    C++允许方法重载 常量 因为复杂的原因。没有足够的空间来详细说明。但这里有几个短的。

    • 常量 常量 常量 方法和来自普通方法的非常量值。
    • 是否 常量 极大地改变了内部方法的绑定。以至于它基本上会变成两个不同的方法体。因此,将其分为两种不同的方法是有意义的。
        5
  •  1
  •   aschepler    14 年前

    除其他答案外,还有一个注释:没有 operator()

    operator const char* () const;
    operator char* ();
    

    是转换运算符,这意味着类的对象可以隐式转换为C样式的字符串,如

    void f(const MyClass& x, MyClass& y) {
      const char* x_str = x;
      char* y_str = y;
    }
    

    运算符()

    class MyClass {
    public:
      const char* operator() (int x, int y) const;
      // ...
    };
    
    void g(const MyClass& obj) {
      const char* result = obj(3, 4);
    }
    
        6
  •  1
  •   Chris Pfohl    14 年前

    如果你正在寻找一个伟大的C++资源(包括使用技巧) const

    一个有用的网站: JRiddel.org

    在C++中声明方法时 常量 mutable 正在调用它的对象中的实例变量。“

    这个 常量 在返回值之前(例如: operator const char*..." )声明它只返回指向 const char* . (您不得更改 char* const char* const ... “它将是指向常量字符的常量指针。(在 常量

    多个版本非常有用,因此编译器可以理解这一点:

    const char* my_const_var = <object_name>();
    char* my_var = <object_name>();
    

        7
  •  1
  •   ArBR    14 年前

    你应该提到 “因为知道何时推荐使用 常量 类成员的修饰符:

    高完整性CPP规则3.1.8

    正当理由 :尽管语言强制执行按位常量正确性,但应将常量正确性视为逻辑性,而不是按位。如果客户端无法确定对象是否因调用该函数而更改,则应将成员函数声明为const。“mutable”关键字可用于声明可在const函数中修改的成员数据,仅当成员数据不影响对象的外部可见状态时才应使用此关键字。

    class C 
    { 
    public: 
         const C& foo() { return * this; }    // should be declared const 
         const int& getData() { return m_i; } // should be declared const 
         int bar() const { return m_mi; }     // ok to declare const 
    private: 
    int m_i; 
    mutable int m_mi; 
    };
    

    参考有效C++项目21;工业强度C++ 7.13;

        8
  •  0
  •   Torlack    14 年前
    1. 开头的Const应用于返回值。最后的Const应用于方法本身。当您将一个方法声明为“const”时,您是说您无意修改该方法中类的任何成员变量。编译器甚至会执行一些基本检查,以确保该方法不会修改成员变量。返回值中的常量防止调用方修改返回的值。当您返回指向由类管理的数据的指针或引用时,这非常有用。这样做通常是为了避免返回复杂数据的副本,这些副本在运行时可能很昂贵。

    2. 有两个不同运算符的原因是“const”版本返回一个const指针,指向类内部可能是数据的内容。如果类的实例是const,那么您可能希望返回的数据也应该是const。“non-const”版本只提供一个方法,当调用方拥有类的非const实例时,该方法返回一个可修改的返回值。