const bei Methoden
-
Const bei Methoden, also int B::func(int a) const, bedeutet doch, dass man Elementvariablen der Klasse nicht verändern darf?
Kann es sein, dass es auch noch bedeutet, dass man den Parameter a nicht verändern darf? Also z.B. in der Methode "func(int a)" schreiben: a +=a+421; ?MfG
Stromberg
-
Stromberg schrieb:
Const bei Methoden, also int B::func(int a) const, bedeutet doch, dass man Elementvariablen der Klasse nicht verändern darf?
Nein, nicht ganz. Es bedeutet, dass das Objekt, für das die Methode angewendet wird, const sein darf. Elementvariablen können dann verändert werden, wenn
- a) sie als mutable deklariert wurden
- b) man sie mit const_cast explizit "entconstet"Im Prinzip kann man sich Methoden einer Klasse vorstellen als Funktionen, die als "nullten" Parameter ein Objekt der Klasse bekommen. mit const-Deklaration wird dieser nullte Parameter const deklariert.
Kann es sein, dass es auch noch bedeutet, dass man den Parameter a nicht verändern darf?
Nein. Das wäre der Fall, wenn der Parameter ein const int wäre.
-
nein

die glaskugel sagt mir, dass du eventuell nach dem stichwort call-by-reference suchst.
-
was passiert, wenn man methoden als const deklariert, aber trotzdem member verändert? abstürze? gar nichts? undefiniertes verhalten?
die frage passt find ich gerade ganz gut hier hin ^^
-
Folgendes Problem:
Crypt.hpp
#include <string> #include <vector> namespace cr { struct detailsCrypt { std::vector<unsigned short> rnd_numbers_key; std::vector<unsigned short> rnd_numbers_2byte; std::vector<unsigned short> rnd_numbers_4byte; }; class Crypt { public: Crypt(); std::string create_key() const; unsigned short transform_key(const std::string &key) const; unsigned short transform_key(const std::string &key, const std::vector<unsigned short> &random_numbers) const; unsigned short downsize_key(unsigned short raw_key) const; //<--!!! private: detailsCrypt cd_data; }; }Crypt.cpp
#include <string> #include <vector> #include "crypt.hpp" #include "random.hpp" using namespace std; using namespace rd; namespace cr { Crypt::Crypt() { } string Crypt::create_key() const { string key; for(int i=0;i<6;++i) { char temp=randomize.rnd(97,122); key +=temp; } return key; } unsigned short Crypt::transform_key(const string &key) const { unsigned short amount=0; for(int i=0;i<6;++i) { //cd_data.rnd_numbers_key.push_back(randomize.rnd(123,1000)); //amount +=cd_data.rnd_numbers_key.back() - key[i]; } return amount; } unsigned short Crypt::transform_key(const string &key, const vector<unsigned short> &random_numbers) const { unsigned short amount=0; for(int i=0;i<6;++i) { amount +=random_numbers[i] - key[i]; } return amount; } unsigned short downsize_key(unsigned short raw_key) const //<-- !!! { if(raw_key < 12) { raw_key +=12; } if((raw_key % 12) == 0) { raw_key /=12; } else { raw_key = ((raw_key - (raw_key % 12)) / 12); } return raw_key; } }ERROR:
Switching to target: default
Compiling: main.cpp
Compiling: crypt.cpp
crypt.cpp:48: error: non-member function `short unsigned int cr::downsize_key(short unsigned int)' cannot have `const' method qualifier
Process terminated with status 1 (0 minutes, 0 seconds)Ich glaub ich bin grad verwirrt.
MfG
Stromberg
-
Zeile 47 vielleicht noch etwas genauer anschauen.

-
Nur Klassen-Methoden dürfen als const deklariert sein, macht ja sonst auch keinen Sinn...
-
unskilled schrieb:
was passiert, wenn man methoden als const deklariert, aber trotzdem member verändert? abstürze? gar nichts? undefiniertes verhalten?
die frage passt find ich gerade ganz gut hier hin ^^das ist ill-formed (außer bei mutable membervariablen) und dein compiler wird dir eine fehlermeldung ausgeben. (wenn du auf die dumme idee kommen solltest, das const von this wegzucasten, gibt es, wenn this tatsächlich auf ein konstantes objekt zeigt, undefiniertes verhalten).
@Stromberg: ohne mir den Code genauer anzusehen, nur die Compilermeldung übersetzt:
unsigned short downsize_key(unsigned short raw_key) constdu hast das Crypt:: vor downsize vergessen. (Das sagt dir aber auch dein Compiler...)
-
Oh verdammt.
-
danke, queer_boy :>