1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Листинг #1 Использование точки как операции доступа к элементу класса #include <cstring> #include <iostream> using std::cout; /*НАШ КЛАСС*/ class MyClass{ public: int x; //Переменная открыта классом, но сокрыта областью видимости класса void show(){ cout << "hello\n"; } //функция открыта классом, но сокрыта областью видимости класса }; int main(){ MyClass student; student.x = 100; //ипользовали запрос с помощью точки cout << student.x << '\n'; student.show(); //ипользовали запрос с помощью точки } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//Листинг #2 Использование стрелки как операции доступа к элементу класса #include <cstring> #include <iostream> using std::cout; /*НАШ КЛАСС*/ class MyClass{ public: int x; //Переменная открыта классом, но сокрыта областью видимости класса void show(){ cout << "hello\n"; } //функция открыта классом, но сокрыта областью видимости класса }; int main(){ MyClass *student = new MyClass; student -> x = 100; //<---- Так просто проще, чем через точку delete student; MyClass *ptr = new MyClass; (*ptr).x = 100; //<--- а так обычно запутываешься delete ptr; //Оба варианта одно и то же } |
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 |
//Листинг #3 Использование точки как операции доступа к элементу класса #include <cstring> #include <iostream> using std::cout; /*НАШ КЛАСС*/ class MyClass{ public: int *x; //Переменная открыта классом, но сокрыта областью видимости класса void show(){ cout << "hello\n"; } //функция открыта классом, но сокрыта областью видимости класса /*с помощью конструктора выделяем память внутреннему для класса указателю*/ MyClass(){ x = new int; } /*с помощью деструктора зачищаем память от внутреннего для класса указателя*/ ~MyClass(){ delete x; } }; int main(){ MyClass student; *student.x = 100; //Точка используется к разыменованному объекту (*student).x cout << *student.x << '\n'; } |
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 |
//Листинг #3 Использование точки как операции доступа к элементу класса #include <cstring> #include <iostream> class MyClass; using std::cout; /*НАШ КЛАСС*/ class MyClass{ public: static int x; //объявление статической переменной, открыта классом,скрыта областью видимости класса static int y; //объявление статической переменной, открыта классом,скрыта областью видимости класса }; int MyClass::x; //уточняем принадлежность к области видимости класса int ::MyClass::y; //уточняем принадлежность к области видимости класса и уточняем дальше принадлежность к области видимости глобального пространства имён int main(){ MyClass::x = 100; MyClass::y = 200; cout << "MyClass::x == " << MyClass::x << '\n'; cout << "MyClass::y == " << MyClass::y << '\n'; } |
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 |
//Листинг #a1 #include <cstring> #include <iostream> class MyClass; using std::cout; /*НАШ КЛАСС*/ class MyClass{ public: static int x; //объявление статической переменной, открыта классом,скрыта областью видимости класса MyClass(){ x++; } }; int MyClass::x; int main(){ MyClass cx; MyClass cy; cout << MyClass::x << '\n'; //Два раза сработал конструктор по умолчанию, x нарастилось до 2 } |
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 |
//Листинг #3 Использование точки как операции доступа к элементу класса #include <cstring> #include <iostream> class MyClass; using std::cout; /*НАШ КЛАСС*/ class MyClass{ public: void foo(); //Одно и то же название функции }; class Student{ public: void foo(); //В разных классах }; void MyClass::foo(){ //<-- уточняем принадлежность имени функции к классу cout << "foo from MyClass\n"; } void Student::foo(){ //<-- уточняем принадлежность имени функции к классу cout << "foo from Student\n"; } int main(){ MyClass m; Student s; m.foo(); s.foo(); } |
❗
Хорошая статья, спасибо!
Но вот такая конструкция встретилась:
Где осталось не понятным применение двоеточия перед вызовом функций в двух последних строках. Была в кодах
С++ при использовании библиотеки Qt3 под FreeBSD.
Этот пример можно не объяснять.
Ответ нашелся: функция SetShow(bool On) принадлежит текущему классу, а SetShow(pbShowInList, On) есть глобальная функция, то есть совсем другая и описана где-то вне этого класса. А чтобы вызвать эту глобальную функцию и ставятся два двоеточия перед ее именем.