Const w róznych przypadkach funkcji

0

Chciałem się dowiedzieć dokładnie co i kiedy daje słowo const w funkcjach. Chodzi mi o 3 przypadki:

  • Przed typem funkcji np. const type function();
  • Przed typem parametru np. int function(const type param);
  • Za funkcją np. int function() const;

Czy jeżeli const przed typem f-cji to może ona zwrócić tylko stałą wartość?
Co dokładnie oznacza const w parametrze, dość często to spotykam, ale tak na prawdę nie wiem do czego to służy.
A 3 przypadek to w ogóle nie mam pojęcia.
Dziękuję za odpowiedź.

1
  1. funkcja/metoda zwraca stałą wartość
  2. funkcja/metoda przyjmuje jako parametr stałą wartość
  3. metoda może być wywołana również dla obiektów typu const
    Deklarujesz się jako programista C++ a takich oczywistych rzeczy nie wiesz? Wstyd.
1

const przed lub za typem oznacza, że danej wartości nie możesz edytować
czyli:

const type function();

oznacza, że funkcja/metoda zwróci wartość, której nie będzie można zmodyfikować np. w klasie:

const string& nazwaklasy()
{
  return nazwaklasy_;
}

zwraca referencje do pola nazwaklasy_ nie pozwalajac tego pola edytowac z zewnątrz.

int function(const type param);

oznacza, że parametr podany w funkcji nie bedzie mogl byc zmieniany w srodku:

int costam(const int n)
{
  // tutaj nie mozesz zmienic n (przydatne jesli nie chcesz przypadkiem zmodyfikowac wartosci)
}

lub ważniejsze:

int costam(const string& s)
{
  // ...
}

twoja funkcja przyjmuje referencje do stringa czyli moze korzystac z tekstu ktory przechowuje ale wiadomo ze funkcja tego tekstu nie zmieni

i teraz w klasie:

int function() const
{
  //...
}

oznacza, że metoda w żaden sposób nie zmienia klasy np.:

int size() const
{
  // 
}

wiadomo ze wywolanie tej funkcji w zaden sposob nie zmopdyfikuje klasy

dzieki temu zapis:

const klasa obiektklasy;
obiektklasy.size()

jest dozwolony

0
winerfresh napisał(a)

# metoda może być wywołana również dla obiektów typu const

Nie jestem pewny a jest okazja się zapytać, więc:
czy to nie oznacza również, że użytkownik klasy wie, że wywołanie tej metody nie zmieni wartości w polach obiektu tej klasy?

1

to co mówisz oznaczone jest 3cim punktem.

może na wskaźnikach pokaże jeszcze troche constów:

int a;
const int* wskaznik = &a;

oznacza wskaźnik na stałą liczbą. Sam wskaźnik można modyfikować, jednakże wartości pod nim już nie.

int* const wskaznik = &a;

oznacza, że wskaźnika nie można modyfikować a wartość pod nią jak najbardziej.

const int* const wskaznik = &a;

oznacza niezmienny wskaźnik na niezmienną wartość.

1

i jeszcze może taki programik (zakomentowane linie powodują błędy kompilacji):

#include <iostream>
#include <string>

using namespace std;

class klasa
{
public:
  klasa(const string& s): nazwa_(s) {}

  const string& nazwa1()
    {
      return nazwa_;
    }
  const string& nazwa2() const
    {
      return nazwa_;
    }
  void zmien_a(int a)
    {
      this->a = a;
    }
  void zmien_b(int b) const
    {
      this->b = b;
    }
private:
  string nazwa_;
  int a;
  mutable int b;
};

int main()
{
  klasa a("cos");
  const klasa& b = a;

  cout << a.nazwa1() << endl;
  //cout << b.nazwa1() << endl;

  cout << a.nazwa2() << endl;
  cout << b.nazwa2() << endl;

  a.zmien_a(5);
  //b.zmien_a(5);

  a.zmien_b(6);
  b.zmien_b(6);

  return 0;
}
1

No to może z grubej rury: http://en.wikipedia.org/wiki/Const-correctness

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0