C++类的访问问题

来源:互联网 发布:ubuntu怎么装输入法 编辑:程序博客网 时间:2024/06/03 07:11

内容整理自:

关于类成员函数中访问同类对象的私有成员

为什么在拷贝构造函数里,可以直接访问另外一个对象的

C++ 的一个问题的理解(私有变量成员)

【C++】 私有成员变量的理解


C++中类访问权限控制:
第一:private, public, protected 访问标号的访问范围,在没有继承的情况下:

  • private:只能由1.该类中的函数、2.其友元函数访问。 不能被任何其他访问,该类的对象也不能访问。
  • protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。 但不能被该类的对象访问。
  • public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。

第二:类的继承后方法属性变化,具体情况如下:

  • private 属性是不能够被继承的,protected继承和private继承能降低访问权限;
  • 使用private继承,父类的protected和public属性在子类中变为private;
  • 使用protected继承,父类的protected和public属性在子类中变为protected;
  • 使用public继承,父类中的protected和public属性不发生改变。


类成员函数中访问同类对象的私有成员,主要包含以下几种场景:

  • 在C++的类的成员函数中,允许直接访问该类的对象的私有成员变量。
  • 在类的成员函数中可以访问同类型实例的私有变量。
  • 拷贝构造函数里,可以直接访问另外一个同类对象(引用)的私有成员。
  • 类的成员函数可以直接访问作为其参数的同类型对象的私有成员。


关于类私有成员的访问,看到了一些常见问题:

在拷贝构造函数中为什么可以访问引用对象的私有变量?

class Point{public:        Point(int xx=0,int yy=0){X=xx;Y=yy;}        Point(Point &p);private:        int X,Y;};Point::Point(Point &p){        X=p.X;        Y=p.Y;}

解答为:

  1. 成员函数中允许访问对象的数据成员,一方面保证了安全性与封装性,另一方面提供方便的操作。只有成员函数可以访问私有成员,这里不涉及友元及派生。这样一来,安全性仍然得到了保证,也完成了封装工作。
  2. 私有是为了实现“对外”的信息隐藏。访问权限(如public,private)是对类而言,而不是对对象。private访问权限是其它类不能访问,而非这个类的不同对象不能访问。
  3. 在这个类的成员函数中的任何操作是对于这个类的所有对象都起作用的,对于类来说,所有的对象都是它的实例,因此都可以访问。
  4. 同类对象互为友元,在一个类的成员函数里面,可以访问该类另一个对象的私有成员。
关于C++的问题,类对象不能访问类私有数据成员
template <class T>class MyClass{private:T value;public:void assign(const MyClass<T>& x){value=x.value;}......};

对象只是不能在类的外部访问类的私有成员,比如MyClass<int> my; my.value就是在外部访问。

0 0