将类类型成员定义为public和private之间有什么区别?

时间:2018-04-18 02:39:19

标签: c++

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_WORD_LENGTH 200

int main () {
FILE *fp = fopen("words.txt","r");
char str[60];
char *largest = (char*) malloc (MAX_WORD_LENGTH);
int smallest_len = MAX_WORD_LENGTH, largest_len = 0;

while (fgets (str, 60, fp) != NULL) 
{
    char *temp = strtok(str, "\n");
    while (temp != NULL) 
    {
        if (strlen(temp) > largest_len) 
        {
            strcpy(largest, temp);
            largest_len = strlen(largest);
        }
        temp = strtok(NULL, "\n");
    }
}

printf("The largest word in the file is: %s\n", largest);

fclose(fp);

return 0;
}

我尝试过构建一个Screen实例。两者都无法访问 pos 。 顺便说一句,我知道访问控制。我只想知道类型成员的访问控制的含义。

5 个答案:

答案 0 :(得分:3)

公共意味着任何人(其他类)都可以触摸这些变量。 私有意味着只有您(您的方法)才能触及这些变量。

有一个洞穴,它引入了#34;朋友&#34;,它提供了一个不是你的功能或类,可以访问所有变量。

成员类型和成员变量以相同的方式工作。除了类的方法和朋友之外,私有类型不可用,就像私有方法或变量一样。相反,任何人都可以访问公共类型,方法或变量。与(非静态)方法和变量不同,类型必须是静态的。

例如,由于pos是私有的,因此无法编译。

#include <string>
class Test {
  private:
    using pos = std::string::size_type;
  public:

};

int main(int argc, char *argv[])
{
  Test::pos a = 5;

  return 0;
}

要从屏幕类外部访问类型pos,请先将typedef移动到公共辅助功能。然后它将与screen::pos一起使用,就像静态方法或变量一样。

以下应该编译得很好(可能是关于a未使用的警告,但这是一个不同的问题。)

#include <string>
class Test {
  public:
    using pos = std::string::size_type;    
};

int main(int argc, char *argv[])
{
  Test::pos a = 5;

  return 0;
}

你可以对此有点疯狂,甚至在内部将整个班级定义为公共或私人。

答案 1 :(得分:0)

因为虽然你的typedef是公共的,但实际的成员被声明为private。 有关详细信息,请参阅C++ class access specifiers

答案 2 :(得分:0)

来源:https://www.tutorialspoint.com/cplusplus/cpp_class_access_modifiers.htm

公众会员

公共成员可以从课外的任何地方访问,但可以在程序中访问。您可以设置并获取没有任何成员函数的公共变量的值,如以下示例所示:

<强>代码:

#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

私人会员:

无法访问私有成员变量或函数,甚至无法从类外部查看。只有class和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

答案 3 :(得分:0)

来自class.access#4

  

由于访问控制适用于名称,因此应用访问控制   到typedef名称,只有typedef名称本身的可访问性   被认为。 实体的可访问性   typedef

class A {
  class B { };
public:
  typedef B BB;
};

void f() {
  A::BB x;          // OK, typedef name A​::​BB is public
  A::B y;           // access error, A​::​B is private
}

因此,并不意味着您的类型是公共的会使成员变量具有公共访问权限。 typedef用于命名类型以指定成员的访问权限。

答案 4 :(得分:0)

类型成员与数据成员不同。它更像是静态的东西,我无法通过实例访问它。因此,将其定义为公共或私人,决定我是否可以通过Screen::pos访问它。那就是它。