Table of Contents
Everything you want to know about constants. Pointer to constants, constant members and constant memberfunctions. Const_cast and mutable. When phisical and logical constants are different?
Be carefull the difference between character arrays and string literals. Arrays are alwais allocated in the user data area, and they are mutable, string literals, however, has type const char array, and they are frequently allocated in read-only areas. Modification attempt of such literals can cause run-time errors.
#include <iostream>
int main()
{
// declaration of three arrays in the user data area
// read and write permissions for the elements:
char t1[] = {'H','e','l','l','o','\0'};
char t2[] = "Hello";
char t3[] = "Hello";
// declaration of two pointers in the user data area
// read and write permissions for the pointers
// ...and...
// allocation of the "Hello" literal (possibly) read-only
char *s1 = "Hello"; // s1 points to 'H'
char *s2 = "Hello"; // ... and s2 likely points to the same place
void *v1 = t1, *v2 = t2, *v3 = t3, *v4 = s1, *v5 = s2;
std::cout <<v1<<'\t'<<v2<<'\t'<<v3<<'\t'<<v4<<'\t'<<v5<<std::endl;
// the result (v1, v2 v3 are different, v4 and v5 could be the same):
0xbffff460 0xbffff450 0xbffff440 0x8048844 0x8048844
// assignment to array elements:
*t1 = 'x'; *t2 = 'q'; *ct = 'y';
// modifying string literal: could be segmentation error:
*s1 = 'w'; *s2 = 'z';
return 0;
}
/////////////////////////////////////////////////////////////////
#include <iostream>
int main()
{
char t[] = "Hello";
const char ct[] = "Hello";
// the type of "Hello" is const char[6]
// const char[] --> char* conversion is
// only for C reverse compatibility
char *s1 = "Hello"; // line 12: warning
// this is the correct C++ way:
const char *s2 = "Hello";
// this program produce warnings:
2_const.cpp: In function `int main()':
2_const.cpp:12: warning: invalid conversion from `const void*' to `void*'
2_const.cpp:17: assignment of read-only location
void *v1 = t, *v2 = ct, *v3 = s1, *v4 = s2; // line 17: warning
std::cout << v1 << '\t' << v2 << '\t' << v3 << '\t' << v4 << std::endl;
*t = 'x'; *ct = 'y'; *s1 = 'w'; *s2 = 'z';
return 0;
}
/////////////////////////////////////////////////////////////////
#include <iostream>
int main()
{
char t[] = "Hello";
const char *s1 = "Hello";
*t = 'x';
*s1 = 'w'; // line 12: syntax error
return 0;
}
// this program won't compile:
3_const.cpp: In function `int main()':
3_const.cpp:12: assignment of read-only location