1 2 3 4 |
class MyClass{ const int x = 100; //<--- о вот такого вида константах речь в статье const unsigned length = 200; }; |
Для проверки требуется поддержка от С++11
1 2 3 4 5 6 7 |
//Листинг #1 clang class MyArray{ const int N = 10; //<-- несмотря на то, что здесь всё хорошо int arr[N]; //<---здесь ошибка компиляции }; int main(){} |
1 2 3 4 5 6 7 8 9 |
//Листинг #2 константные переменные внутри класса #include <iostream> class MyArray{ enum {N=10}; //<-- теперь всё хорошо; int arr[N]; //<--- это работает! }; int main(){} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//Листинг #3.1 enum в качестве константы для переменных класса #include <iostream> using namespace std; class MyArray{ public: enum {N=10}; //<-- несмотря на то, что здесь всё хорошо; int arr[N]; //<---здесь ошибка компиляции }; int main(){ MyArray obj; for (int i=0; i<MyArray::N; i++) obj.arr[i] = i; for (int i=0; i<MyArray::N; i++) cout << obj.arr[i] << " "; cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//Листинг #3.2 enum в качестве константы для переменных класса #include <iostream> using namespace std; class MyArray{ enum {N=10}; //<-- несмотря на то, что здесь всё хорошо; int arr[N]; //<---здесь ошибка компиляции public: int get_arr_size() const{ return N; //<--вытаскиваем константу } void set_value(const int position, const int value){ //функция записи значений в массив arr[position] = value; } int get_value(const int position) const{ //функция, вытаскивающая значения из массива return arr[position]; } }; int main(){ MyArray obj; const int MaxLen = obj.get_arr_size(); //<--запоминаем значение в отдельное хранилище for (int i=0; i<MaxLen; i++){ //<--- С помощью цикла obj.set_value(i, i+10); //записываем значения в массив объекта } for (int i=0; i<MaxLen; i++){ cout << "arr[" << i << "] == " << obj.get_value(i) << '\n'; //<--красиво выодим информацию на экран } cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//Листинг #3.3 enum в качестве константы класса #include <iostream> using namespace std; class MyArray{ enum {N=10}; //<-- несмотря на то, что здесь всё хорошо; int arr[N]; //<---здесь ошибка компиляции public: int get_arr_size() const{ return N; //<--вытаскиваем константу } void set_value(const int position, const int value){ //функция записи значений в массив arr[position] = value; } void show(){ for (int i=0; i<N; i++){ cout << "arr[" << i << "] == " << arr[i] << '\n'; //<--красиво выодим информацию на экран } } }; int main(){ MyArray obj; const int MaxLen = obj.get_arr_size(); //<--запоминаем значение в отдельное хранилище for (int i=0; i<MaxLen; i++){ //<--- С помощью цикла obj.set_value(i, i+10); //записываем значения в массив объекта } obj.show(); //<-- можно сделать и так cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Листинг #4 class MyClass{ public: enum {ROW = 3, COL = 4}; //<-- перечисление констант int arr[ROW][COL]; //двумерный массив }; int main(){ MyClass my_object; const int ROW = MyClass::ROW; const int COL = MyClass::COL; int index = 0; for (int i=0; i<ROW; i++){ for (int j=0; j<COL; j++){ my_object.arr[i][j] = index++; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//Листинг #5 static const для переменной класса #include <iostream> using std::cout; class MyClass{ public: static const int N = 10; //Навешивание static на const помогает int arr[N]; }; int main(){ MyClass my_object; const int MAX_LEN = MyClass::N; //запоминаем for (int i=0; i<MAX_LEN; i++) my_object.arr[i] = i; //записываем значения for (int i=0; i<MAX_LEN; i++) cout << "arr[" << i << "] == " << my_object.arr[i] << '\n'; //выводим значения } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Листинг #6.1 #include <iostream> using std::cout; class MyClass{ public: enum {N = 10}; //Навешивание static на const помогает int arr[N]; }; int main(){ MyClass my_object; // int& MAX_LEN = MyClass::N; //Ошибка, потому что ссылка, привязанная к константному значению, должна быть константой const int& MAX_LEN = MyClass::N; //константной ссылкой сократили for (int i=0; i<MAX_LEN; i++) my_object.arr[i] = i; //записываем значения for (int i=0; i<MAX_LEN; i++) cout << "arr[" << i << "] == " << my_object.arr[i] << '\n'; //выводим значения } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Листинг #6.2 #include <iostream> using std::cout; class MyClass{ public: enum {N = 10}; //Навешивание static на const помогает int arr[N]; }; int main(){ MyClass my_object; // int& MAX_LEN = MyClass::N; //Ошибка, потому что ссылка, привязанная к константному значению, должна быть константой const int& MAX_LEN = MyClass::N; //константной ссылкой сократили for (int i=0; i<MAX_LEN; i++) my_object.arr[i] = i; //записываем значения for (int i=0; i<MAX_LEN; i++) cout << "arr[" << i << "] == " << my_object.arr[i] << '\n'; //выводим значения } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Листинг #6.3 #include <iostream> using std::cout; namespace MySpace{ //<--- завернули в область видимости, поименовали область видимости названием MySpace class MyClass{ public: enum {N = 10}; //обычная константа вне класса int arr[N]; }; } //закрыли пространство int main(){ MySpace::MyClass my_object; enum {MAX_LEN = MySpace::MyClass::N}; //можно сократить и вот так, если значение целое число for (int i=0; i<MAX_LEN; i++) my_object.arr[i] = i; //записываем значения for (int i=0; i<MAX_LEN; i++) cout << "arr[" << i << "] == " << my_object.arr[i] << '\n'; //выводим значения } |
Ещё можно даже использовать не
, а
Да, если компилятор поддерживает С++11.