Открытый член класса доступен для пользователей; закрытый член класса доступен только членам класса.
class Date { public:
// . . . int next_day(); private:
int y, m, d;
};
void Date::next_day() { return d+1; } // OK void f(Date d)
{
int nd = d.d+1; // ошибка: Date::d — закрытый член класса // . . .
}
Структура — это класс, члены которого по умолчанию являются открытыми. struct S {
// члены (открытые, если явно не объявлены закрытыми)
};
К членам объекта можно обращаться с помощью оператора . (точка), примененного к его имени, или оператора -> (стрелка), примененного к указателю на него. struct Date {
int d, m, y;
int day() const { return d; } // определенный в классе int month() const; // просто объявленный; определен
Также вам может показаться, что такая тема как
// в другом месте int year() const; // просто объявленный; определен
// в другом месте
};
Date x;
x.d = 15; // доступ через переменную
int y = x.day(); // вызов через переменную
Date* p = &x;
p->m = 7; // доступ через указатель
int z = p->month(); // вызов через указатель
На члены класса можно ссылаться с помощью оператора :: (разрешение области видимости).
int Date::year() const { return y; } // определение за пределами
// класса
В функциях-членах класса можно ссылаться на другие члены класса, не указывая имя класса.
struct Date {
int d, m, y;
int day() const { return d; }
// . . .
};
Такие имена относятся к объекту, из которого вызвана функция: void f(Date d1, Date d2)
{
d1.day(); // обращается к члену d1.d d2.day(); // обращается к члену d2.d // . . .
}
Указатель this
Если хотите явно сослаться на объект, из которого вызвана функция-член, то можете использовать зарезервированный указатель this.
A. 12. КЛАССЫ
1117
struct Date {
int d, m, y;
int month() const { return this->m; }
// . . .
};
Функция-член, объявленная с помощью спецификатора const (константная функция-член), не может изменять значение члена объекта, из которого она вызвана.
struct Date {
int d, m, y;
int month() const { ++m; } // ошибка: month() — константная
// функция
// . . .
};
Друзья
Функция, не являющаяся членом класса, может получить доступ ко всем членам- класса, если ее объявить с помощью ключевого слова friend. Рассмотрим пример.
// требует доступа к членам классов Matrix и Vector members:
Vector operator*(const Matrix&, const Vector&);
class Vector { friend
Vector operator*(const Matrix&, const Vector&); // есть доступ // . . .
};
class Matrix { friend
Vector operator*(const Matrix&, const Vector&); // есть доступ // . . .
};
Как показано выше, обычно это относится к функциям, которым нужен доступ к двум классам. Другое предназначение ключевого слова friend — обеспечивать функцию доступа, которую нельзя вызывать как функцию-член.
class Iter { public:
int distance_to(const iter& a) const;
friend int difference(const Iter& a, const Iter& b);
// . . .
};
void f(Iter& p, Iter& q)
{
int x = p.distance_to(q); // вызов функции-члена
1118
ПРИЛОЖЕНИЕ A • КРАТКИЙ ОБЗОР ЯЗЫКА
int y = difference(p,q); // вызов с помощью математического
// синтаксиса
// . . .
}
Отметим, что функцию, объявленную с помощью ключевого слова friend, нельзя объявлять виртуальной.
A.12.2. Определения членов класса
Члены класса, являющиеся целочисленными константами, функциями или типами, могут быть определены как в классе, так и вне его. struct S {
static const int c = 1; static const int c2;
void f() { } void f2();
struct SS { int a; }; struct SS2;
};
Члены, которые не были определены в классе, должны быть определены “где-то”.
const int S::c2 = 7; void S::f2() { } struct S::SS2 { int m; };
Статические константные целочисленные члены класса (static const int) представляют собой особый случай. Они просто определяют символические целочисленные константы и не находятся в памяти, занимаемой объектом. Нестатические данные-члены не требуют отдельного определения, не могут быть определены отдельно и инициализироваться в классе.
struct X { int x;
int y = 7; // ошибка: нестатические данные-члены
// не могут инициализироваться внутри класса static int z = 7; // ошибка: данные-члены, не являющиеся
// константами, не могут инициализироваться // внутри класса static const string ae = "7"; // ошибка: нецелочисленный тип
// нельзя инициализировать // внутри класса static const int oe = 7; // OK: статический константный
// целочисленный тип
};
int X::x = 7; // ошибка: нестатические члены класса нельзя // определять вне класса
Если вам необходимо инициализировать не статические и не константные данные-члены, используйте конструкторы.
Функции-члены не занимают память, выделенную для объекта.
struct S { int m; void f();
};
Здесь sizeof(S)==sizeof(int). На самом деле стандартом это условие не регламентировано, но во всех известных реализациях языка оно выполняется. Следует подчеркнуть, что класс с виртуальной функцией имеет один скрытый член, обеспечивающий виртуальные вызовы.
Опубликовал katy
May 03 2015 12:01:37 ·
0 Комментариев ·
2657 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.