Topic: C++ const semantic
Author: "D. Allan Drummond" <allan.drummond@trilogy.com>
Date: 1996/01/11 Raw View
jlm@two-oo-one.fr wrote:
>
> In C++ the "A::raz () const" doesn't change the content
> of an A, but it may change its behaviour. Let me take a
> simple example:
>
> class A {
> char* text_;
> public:
> A (const char* t)
> : text_ (strcpy (new char[strlen(t)+1], t)) {}
> void raz () const {text_[0] = 0;}
> };
While it's true that the behavior of an A may change, all that
const means is that its content does not change -- which you
appear to recognize.
The problem in this case is that you are using char* to mean
"string", when all it really means is "pointer to char". A
better workaround, using the new standard (STL and ANSI string),
is to say:
#include <bstring.h> // HP public-domain string implementation
class A {
string text_;
public:
A( const char* t ) : text_( t ) {}
void raz() { text_[0] = 0; }
};
Note that raz() now cannot be const - making it const produces a
compile-time error.
Allan
allan.drummond@trilogy.com
---
[ comp.std.c++ is moderated. Submission address: std-c++@ncar.ucar.edu.
Contact address: std-c++-request@ncar.ucar.edu. The moderation policy
is summarized in http://dogbert.lbl.gov/~matt/std-c++/policy.html. ]
Author: jlm@two-oo-one.fr
Date: 1995/12/19 Raw View
| In C++ the "A::raz () const" doesn't change the content
| of an A, but it may change its behaviour. Let me take a
| simple example:
class A {
char* text_;
public:
A (const char* t) : text_ (strcpy (new char[strlen(t)+1], t)) {}
void raz () const {text_[0] = 0;}
};
| In other Object Oriented Languages, A::raz couldn't have been
| declared as a const methods.
|
| - Why this "loose" C++ const semantic ?
| - What about implementing the "pure" const semantic ?
| - What about the following work-around ?
#define VAR
template <class T>
class Ptr {
private:
T* ptr_;
public:
Ptr() {ptr_ = 0; }
Ptr(T* t) {ptr_ = t;}
~Ptr() {delete ptr_;}
operator T* () VAR { return ptr_; }
operator const T* () const { return ptr_; }
VAR T* operator->() VAR { return ptr_; }
const T* operator->() const { return ptr_; }
VAR T& operator* () VAR { return *ptr_; }
const T& operator* () const { return *ptr_; }
VAR T& operator[](int i) VAR { return ptr_[i];}
const T& operator[](int i) const { return ptr_[i];}
};
class A {
public:
void var_methode () VAR {}
void const_methode() const {}
};
class B {
public:
B() : pure_ (new A[10]) {}
private:
Ptr<A> pure_;
A* loose_;
public:
void detect_viol_const () const {pure_ ->var_methode ();}
void no_detect_viol_const () const {loose_->var_methode ();}
void const_methode () const {pure_ ->const_methode();}
void detect_viol_const2 () const {(*pure_) .var_methode ();}
void no_detect_viol_const2() const {(*loose_).var_methode ();}
void const_methode2 () const {(*pure_) .const_methode();}
void detect_viol_const3 () const {((const A*)pure_ )->var_methode ();}
void detect_viol_const3b () const {((A*)pure_ )->var_methode ();}
void no_detect_viol_const3() const {((A*)loose_)->var_methode ();}
void const_methode3 () const {((const A*)pure_ )->const_methode();}
void detect_viol_const4 () const {pure_ [0].var_methode ();}
void no_detect_viol_const4() const {loose_[0].var_methode ();}
void const_methode4 () const {pure_ [0].const_methode();}
};
jlm
--
+----------------------------+------------------------------------+
| Jean-Louis Moser | 2001 SA |
| tel: 33 (1)46.66.54.54 | 2, rue de la renaissance |
| Email: jlm@two-oo-one.fr | F-92184 Antony Cedex |
+----------------------------+------------------------------------+
---
[ comp.std.c++ is moderated. Submission address: std-c++@ncar.ucar.edu.
Contact address: std-c++-request@ncar.ucar.edu. The moderation policy
is summarized in http://dogbert.lbl.gov/~matt/std-c++/policy.html. ]