C++ 类访问修饰符



  • 类访问修饰符

    数据隐藏是面向对象编程的重要功能之一,它可以防止程序的功能直接访问类类型的内部表示。类成员的访问限制由类主体中标记为公共,私有和受保护的部分指定。关键字publicprivateprotected称为访问说明符。一个类可以具有多个公共,受保护或私有标记的部分。每个部分都保持有效,直到看到另一个部分标签或类主体的右右括号为止。成员和类的默认访问权限为私有(private)。
    
    class Base { 
       public:
          // public members go here
       
       protected:
     
          // protected members go here
       private:
          // private members go here
     
    };
    
    
  • public 成员

    成员函数可以在类定义中定义,也可以使用范围解析运算符::单独定义。在类定义中定义成员函数将内联声明函数,即使您没有使用内联说明符。因此您可以将Volume()函数定义为下面的值
    
    #include <iostream>
     
    using namespace std;
     
    class Line {
       public:
          double length;
          void setLength( double len );
          double getLength( void );
    };
     
    // Member functions definitions
    double Line::getLength(void) {
       return length ;
    }
     
    void Line::setLength( double len) {
       length = len;
    }
     
    // Main function for the program
    int main() {
       Line line;
     
       // set line length
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() << endl;
     
       // set line length without member function
       line.length = 10.0; // OK: because length is public
       cout << "Length of line : " << line.length << endl;
       
       return 0;
    }
    
    
    编译并执行上述代码后,将产生以下结果-
    
    Length of line : 6
    Length of line : 10
    
    
  • private 成员

    私有(private)成员变量或函数不能访问,甚至不能从类外部查看。只有类本身和它的friend函数可以访问私有成员。默认情况下,一个类的所有成员都是私有的,例如在下面的类中,width是私有成员,这意味着除非您标记一个成员,否则它将被假定为私有成员-
    
    class Box {
       double width;
       
       public:
          double length;
          void setWidth( double wid );
          double getWidth( void );
    };
    
    
    实际上,我们在私有部分定义数据,而在公共部分定义相关函数,以便可以从类外部调用它们,如以下程序所示。
    
    #include <iostream>
     
    using namespace std;
     
    class Box {
       public:
          double length;
          void setWidth( double wid );
          double getWidth( void );
     
       private:
          double width;
    };
     
    // Member functions definitions
    double Box::getWidth(void) {
       return width ;
    }
     
    void Box::setWidth( double wid ) {
       width = wid;
    }
     
    // Main function for the program
    int main() {
       Box box;
     
       // set box length without member function
       box.length = 10.0; // OK: because length is public
       cout << "Length of box : " << box.length << endl;
     
       // set box width without member function
       // box.width = 10.0; // Error: because width is private
       box.setWidth(10.0);  // Use member function to set it.
       cout << "Width of box : " << box.getWidth() << endl;
     
       return 0;
    }
    
    
    上面的代码编译并执行后,返回以下结果-
    
    Length of box : 10
    Width of box : 10
    
    
  • protected 成员

    受保护的(protected)成员变量或函数是非常相似的私有成员,但它提供了一个额外的好处,他们可以在被称为派生(继承)类的子类进行访问。在下一章中,您将学习派生类和继承。现在,您可以检查以下示例,其中我从父类Box派生了一个子类SmallBox。下面的示例与上面的示例相似,此处width成员将可由其派生类SmallBox的任何成员函数访问。
    
    #include <iostream>
    using namespace std;
     
    class Box {
       protected:
          double width;
    };
     
    class SmallBox:Box { // SmallBox is the derived class.
       public:
          void setSmallWidth( double wid );
          double getSmallWidth( void );
    };
     
    // Member functions of child class
    double SmallBox::getSmallWidth(void) {
       return width ;
    }
     
    void SmallBox::setSmallWidth( double wid ) {
       width = wid;
    }
     
    // Main function for the program
    int main() {
       SmallBox box;
     
       // set box width using member function
       box.setSmallWidth(5.0);
       cout << "Width of box : "<< box.getSmallWidth() << endl;
     
       return 0;
    }
    
    
    上面的代码编译并执行后,返回以下结果-
    
    Width of box : 5