Значение 'const' последний в объявлении функции класса?

Вы можете использовать 'encodeURIComponent' для выполнения кодировки URL для этого компонента. Я использовал это и проверял с браузерами IE, Firefox и Chrome.

657
задан Rakete1111 3 June 2018 в 13:20
поделиться

6 ответов

При добавлении ключевого слова const в метод указатель this по существу станет указателем на объект const , и поэтому вы не можете изменить какие-либо данные члена. (Если вы не используете mutable , об этом позже).

Ключевое слово const является частью сигнатуры функции, что означает, что вы можете реализовать два похожих метода, один из которых называется когда объект имеет значение const , а объект - нет.

#include <iostream>

class MyClass
{
private:
    int counter;
public:
    void Foo()
    { 
        std::cout << "Foo" << std::endl;    
    }

    void Foo() const
    {
        std::cout << "Foo const" << std::endl;
    }

};

int main()
{
    MyClass cc;
    const MyClass& ccc = cc;
    cc.Foo();
    ccc.Foo();
}

Это приведет к выводу

Foo
Foo const

. В неконстантном методе вы можете изменить элементы экземпляра, чего нельзя сделать в конст версия. Если вы измените объявление метода в приведенном выше примере на приведенный ниже код, вы получите несколько ошибок.

    void Foo()
    {
        counter++; //this works
        std::cout << "Foo" << std::endl;    
    }

    void Foo() const
    {
        counter++; //this will not compile
        std::cout << "Foo const" << std::endl;
    }

Это не совсем так, потому что вы можете пометить элемент как изменяемый , а метод const может изменить его. В основном он используется для внутренних счетчиков и прочего. Решением для этого будет следующий код.

#include <iostream>

class MyClass
{
private:
    mutable int counter;
public:

    MyClass() : counter(0) {}

    void Foo()
    {
        counter++;
        std::cout << "Foo" << std::endl;    
    }

    void Foo() const
    {
        counter++;
        std::cout << "Foo const" << std::endl;
    }

    int GetInvocations() const
    {
        return counter;
    }
};

int main(void)
{
    MyClass cc;
    const MyClass& ccc = cc;
    cc.Foo();
    ccc.Foo();
    std::cout << "Foo has been invoked " << ccc.GetInvocations() << " times" << endl;
}

, который выведет

Foo
Foo const
Foo has been invoked 2 times
897
ответ дан 22 November 2019 в 21:37
поделиться

Константа означает, что метод обещает не изменять ни одного члена класса. Вы сможете выполнить элементы объекта, которые так помечены, даже если сам объект был помечен const :

const foobar fb;
fb.foo();

будет законным.

См. Сколько и какие использует «const» в C ++? для получения дополнительной информации.

180
ответ дан 22 November 2019 в 21:37
поделиться

Спецификатор const означает, что методы могут быть вызваны для любого значения foobar . Разница возникает, когда вы рассматриваете вызов неконстантного метода для константного объекта. Рассмотрим, имеет ли ваш тип foobar следующее дополнительное объявление метода:

class foobar {
  ...
  const char* bar();
}

Метод bar () не является константным и доступен только из неконстантных значений.

void func1(const foobar& fb1, foobar& fb2) {
  const char* v1 = fb1.bar();  // won't compile
  const char* v2 = fb2.bar();  // works
}

Идея const состоит в том, чтобы пометить методы, которые не изменят внутреннее состояние класса. Это мощная концепция, но на самом деле не применяется в C ++. Это скорее обещание, чем гарантия. И тот, который часто ломается и легко ломается.

foobar& fbNonConst = const_cast<foobar&>(fb1);
46
ответ дан 22 November 2019 в 21:37
поделиться

Эти const означают, что компилятор выдаст ошибку, если метод 'с const' изменит внутренние данные.

class A
{
public:
    A():member_()
    {
    }

    int hashGetter() const
    {
        state_ = 1;
        return member_;
    }
    int goodGetter() const
    {
        return member_;
    }
    int getter() const
    {
        //member_ = 2; // error
        return member_;
    }
    int badGetter()
    {
        return member_;
    }
private:
    mutable int state_;
    int member_;
};

Тест

int main()
{
    const A a1;
    a1.badGetter(); // doesn't work
    a1.goodGetter(); // works
    a1.hashGetter(); // works

    A a2;
    a2.badGetter(); // works
    a2.goodGetter(); // works
    a2.hashGetter(); // works
}

Прочитайте этот для получения дополнительной информации

23
ответ дан 22 November 2019 в 21:37
поделиться

Ответ Блэра находится на отметке.

Однако обратите внимание, что существует изменяемый квалификатор которые могут быть добавлены к членам класса данных. Любой член, помеченный как , может быть изменен в методе const без нарушения контракта const .

Возможно, вы захотите использовать это (например), если вы хотите, чтобы объект запомнил, сколько раз вызывается конкретный метод, не влияя на «логическую» константность этого метода.

12
ответ дан 22 November 2019 в 21:37
поделиться

константа ключевое слово, используемое с объявлением функции, указывает, что это функция членства константы, и это будет не мочь измениться элементы данных объекта.

1
ответ дан 22 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: