c ++函数语法/原型 - 括号后的数据类型

时间:2013-07-24 02:05:08

标签: c++ function

我非常熟悉C / C ++标准函数声明。我最近看到过这样的事情:

int myfunction(char parameter) const

以上只是一个假设的例子,我甚至不知道它是否有意义。我指的是参数之后的部分。常数。这是什么?

一个更实际的例子:

wxGridCellCoordsArray GetSelectedCells() const

可以找到here 那么文本const到底在做什么呢?

4 个答案:

答案 0 :(得分:7)

const表示该函数不会更改this的任何数据成员,除非它们被标记为可变。
只有一个成员函数可以标记为const,这意味着在函数内部不会更改任何成员。

答案 1 :(得分:4)

const关键字在函数后显示时,保证函数调用者不会更改任何成员数据变量。

例如,给出了这个课程,

// In header
class Node {

public:

Node();

void changeValue() const;

~Node();

private:

int value;

};

//在.cpp

void Node::changeValue() const {
    this->value = 3; // This will error out because it is modifying member variables
}

此规则有例外。如果声明成员数据变量是可变的,那么无论函数是否声明为const,都可以更改它。使用mutable是因为对象被声明为常量的罕见情况,但实际上有成员数据变量需要更改选项。其使用的一个潜在示例是缓存您可能不想重复原始计算的值。这通常很少见......但要注意它是很好的。

例如,给出了这个课程,

// In header
class Node {

public:

Node();

void changeValue() const;

~Node();

private:

mutable int value;

};

//在.cpp

void Node::changeValue() const {
    this->value = 3; // This will not error out because value is mutable
}

答案 2 :(得分:4)

这是一种“防御性编程”技术,可以帮助防范您自己的编程错误。使用const对函数参数,您声明该函数不应该修改该参数,并且添加const会导致编译器阻止您无意中这样做。类似地,如果你编写一个不应该改变你的类的任何成员变量的成员函数,那么你可以像这样声明整个函数const,它会阻止你这样做。

它还有助于使您的代码自我记录。将const添加到参数会告诉用户'此函数不会修改此参数'。将const添加到成员函数会告诉用户'此函数不会修改类的任何成员'(显式可变的成员除外)。

除了那些你真正需要的东西之外,限制访问某些东西应该被认为是一件好事。这就是为什么你不经常以root用户身份登录你自己的系统的原因,即使你可以这样做,如果你这样做,你会有更多的权力。

答案 3 :(得分:2)

方法之后的const关键字意味着隐式this参数(设置为用于调用方法的对象的地址)指向常量对象。

在C ++中。成员函数可能如下所示:

class Foo {
    int x;
    mutable int y;
public:
    void bar ()       {
        Foo *me = this;          // * this is an implicit parameter
                                 //   that points to the instance used
                                 //   to call bar()
        assert(&x == &this->x);  // * accesses to class members are
                                 //   implicitly taken from this
        x = 1;                   // * can modify data members
    }
    void bar () const {
        // Foo *me = this;       // * error, since "bar() const" means
                                 //   this is a "const Foo *"
        const Foo *me = this;    // * ok
        // x = 1;                // * error, cannot modify non-mutable
                                 //   members of a "const Foo"
        y = 0;                   // * ok, since y is mutable
    }
};

C中的模拟分别是访问struct Foo *const struct Foo *的函数:

struct Foo {
    int x;
    int y;
};

void Foo_bar (Foo *this)        { /* ... */ } /* can modify this->x and this->y */
void cFoo_bar (const Foo *this) { /* ... */ } /* cannot modify this->x nor this->y */

C中没有mutable类似物。