Я пытался изучать C ++ в течение некоторого времени. Недавно я наткнулся на следующий фрагмент кода:
#include <iostream>
using namespace std;
class Point {
private:
double x_, y_;
public:
Point(double x, double y){
x_ = x;
y_ = y;
}
Point() {
x_ = 0.0;
y_ = 0.0;
}
double getX(){
return x_;
}
double getY(){
return y_;
}
void setX(double x){
x_ = x;
}
void setY(double y){
y_ = y;
}
void add(Point p){
x_ += p.x_;
y_ += p.y_;
}
void sub(Point p){
x_ -= p.x_;
y_ -= p.y_;
}
void mul(double a){
x_ *= a;
y_ *= a;
}
void dump(){
cout << "(" << x_ << ", " << y_ << ")" << endl;
}
};
int main(){
Point p(3, 1);
Point p1(10, 5);
p.add(p1);
p.dump();
p.sub(p1);
p.dump();
return 0;
}
И по жизни я не могу понять, почему методы void add(Point P)
а также void sub( Point p )
Работа.
Я не должен получить ошибку, как "cannot access private properties of class Point"
или что-то, когда я пытаюсь использовать add
или же sub
?
Программа составлена с gcc
версия 4.6.3
(Ubuntu/Linaro 4.6.3-1ubuntu5)
,
При запуске выдает:
(13, 6)
(3, 1)
Приватное ключевое слово указывает, что эти члены доступны только из функций-членов и друзей класса. Закрытые переменные доступны для объектов того же типа, даже из других экземпляров класса.
Это не о безопасности, что думают многие люди. Речь идет о сокрытии внутренней структуры класса от других кодов. Требуется, чтобы класс не испортил другие экземпляры случайно, поэтому нет смысла скрывать переменные от других экземпляров. (На самом деле это было бы немного сложнее реализовать, и нет или мало причин для этого.)
private
члены не могут быть доступны извне класса, за исключением friend
с, но может быть из любого места внутри класса.
Вы можете вызывать сами методы, потому что они находятся в public
раздел определения класса, и они могут получить доступ private
члены, потому что они являются частью класса.
private:
double x_, y_;
public:
Point(double x, double y)
Point()
double getX()
double getY()
void setX(double x)
void setY(double y)
void add(Point p)
void sub(Point p)
void mul(double a)
void dump()
Поля в private
могут быть доступны только другим ученикам в этом случае (без друзей).
public
участники могут быть доступны любому.
Поскольку доступ к этим переменным происходит из в классе через его методы; вы не обращаетесь к переменным напрямую.
Вы путаете «класс» с «объектом». Чтобы поместить это в ваш образ мышления. Объект может получить доступ к закрытым членам другого объекта, если оба объекта принадлежат к одному и тому же классу.
поскольку add(Point p)
а также sub (Point p)
являются членами класса Point
они могут получить доступ к закрытым членам любого экземпляра Point
(в этом случае p
) и не только частные члены объекта this
,
У вас нет прямого доступа к закрытым членам класса. Вы вызываете методы add () и sub (), которые являются публичными методами. Эти являются разрешен доступ к закрытым переменным-членам.
Если бы вы попытались:
p.x_ ++;
это не будет разрешено, так как x_ является частным для класса Point