我一直在尝试学习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)
答案 0 :(得分:7)
私有关键字指定只能从该类的成员函数和朋友访问这些成员。私有变量甚至可以从类的其他实例访问相同类型的对象。
这不是关于许多人的想法的安全性。这是关于从其他代码隐藏类的内部结构。要求一个类不会意外地弄乱其他实例,因此没有必要隐藏其他实例中的变量。 (实际上实现起来会有点棘手,没有或没有理由这样做。)
答案 1 :(得分:5)
private
成员除了friend
之外,不能从类外部访问,但可以来自类内的任何位置。
答案 2 :(得分:3)
您可以自行调用这些方法,因为它们位于类定义的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
个成员。
答案 3 :(得分:3)
因为对这些变量的访问是通过它的方法从 类 中进行的;你没有直接访问变量。
答案 4 :(得分:0)
你很困惑&#34; class&#34;与&#34;对象&#34;。把它放在你的思维方式。如果两个对象属于同一个类,则Object可以访问另一个对象的私有成员。
答案 5 :(得分:0)
由于add(Point p)
和sub (Point p)
是类Point
的成员,因此他们可以访问Point
的任何实例的私有成员(在本例中为p
)并且不仅是对象this
的私有成员。
答案 6 :(得分:-1)
您不是直接访问私有类成员。您正在调用add()和sub()方法,它们是公共方法。允许这些 访问私有成员变量。
如果您尝试:
p.x_ ++;
这是不允许的,因为x_是Point类的私有