题 C ++私有结构


我已经读过类和结构(除了函数)之间的主要区别是类成员默认为private,而结构成员默认为public。

这意味着结构成员可以是私人的。我的问题是:你有私人结构成员吗?如果可以的话,使用私人会员的目的是什么?你怎么会访问它们?


14
2017-12-10 05:23


起源


您可以像访问私有类成员一样访问私有结构成员。如果你认为结构和类不同,这个问题才有意义。试着把它们想象得非常相同。 - Mooing Duck


答案:


是结构可以有私有成员,您只需要使用访问说明符。

struct Mystruct
{
    private:
       m_data;

};

只有结构和类别之间的区别是:

  • 访问说明符默认为private为class,public为public
  • 对于struct,继承默认为private,对于struct,则为public

你怎么能访问它们?
就像你访问一个类的私人成员一样。即:它们只能在结构成员函数内访问,而不能在派生结构等中访问。


22
2017-12-10 05:26





只要 之间的区别 struct 和 class 是默认访问(除了一些奇怪的模板情况,请参阅下面的Alf的评论)。这意味着您可以像在类中一样访问私有成员:

struct foo {
  int get_X() { return x; }
  void set_X(int x_) { x = x_; }
private:
  int x;
};

你是否使用 struct 要么 class那么,纯粹是一种风格问题。我倾向于使用 struct 所有成员都是公开的(例如,如果它是一个没有成员变量且只有公共函数的仿函数类)。


1
2017-12-10 05:32



好吧,关于关键字,模板参数列表中也存在差异,例如, template< template< class Foo > class Bar >。你不能写那个 struct。 :-) - Cheers and hth. - Alf
你不能用 typename 为此(这将是语法错误)。干杯, - Cheers and hth. - Alf
@ AlfP.Steinbach我相信我说的是不能使用关键字 struct 在 任何一种模板因为必须使用其中之一 class 要么 typename。您使用模板模板参数创建示例的事实实际上有点令人困惑。 - NeXuS
@Nexus:我认为你在谈论模板参数列表,在这种情况下我认为你是对的。我使用模板模板参数只是因为那是一个案例 class 必须使用关键字。 - Cheers and hth. - Alf
@ AlfP.Steinbach好的,但你的例子令人困惑的是 template<template <typename Foo> class Bar> class MyClass; 是完全合法的。只是想指出来。 - NeXuS


使这个有用的一件事是你也可以在结构中使用朋友关键字,因此私有成员只能由那些特定的函数或类使用和修改,或者你想要能够修改它的不是什么。这样,用户无法自行修改这些部分。它们甚至不会出现在自动填充功能中,至少在视觉工作室中是这样。


0
2018-04-03 21:32