C++ 私有结构体

36

我读到过关于类和结构体之间主要区别(除函数之外)的内容,即类成员默认为私有,而结构体成员默认为公有。

这意味着结构体成员可以是私有的。我的问题是:你能够拥有私有结构体成员吗?如果可以,使用私有成员的目的是什么?你又如何访问它们?


你可以通过与访问私有类成员相同的方式来访问私有结构成员。只有当你将结构体和类视为不同的时候,这个问题才有意义。试着将它们视为几乎相同的东西。 - Mooing Duck
3个回答

46

结构体可以拥有私有成员,只需使用相应的访问修饰符即可。

struct Mystruct
{
    private:
       m_data;

};

结构体和类之间唯一的区别在于:

  • 对于类,访问修饰符默认为private;对于结构体,访问修饰符默认为public
  • 对于类,继承默认为private;对于结构体,继承默认为public

如何访问它们?
就像访问类的私有成员一样。即:它们只能在结构体的成员函数中访问,不能在派生结构体等中访问。


7

structclass 之间唯一的区别在于默认访问权限(除了某些奇怪的模板情况,详见下面 Alf 的评论)。这意味着您可以像在类中一样访问私有成员:

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

无论您使用 struct 还是 class,都是纯粹的风格问题。如果所有成员都是公共的(例如,如果它是一个没有成员变量且只有公共函数的函数对象类),我倾向于使用 struct

5
关于关键字,在模板参数列表中也有区别,例如 template< template< class Foo > class Bar >。你无法使用 struct 写出这种形式。 :-) - Cheers and hth. - Alf
2
你不能在那里使用 typename(这将是语法错误)。干杯! - Cheers and hth. - Alf
3
我认为我说得没错,无论何种类型的模板都不能使用关键字 struct,因为必须使用 classtypename。你使用模板模板参数的示例实际上有点令人困惑。 - NeXuS
1
@Nexus:我认为你说的是模板参数列表,在这种情况下我认为你是正确的。我使用了模板模板参数,只是因为那是class关键字必须使用的情况。 - Cheers and hth. - Alf
1
@AlfP.Steinbach 好的,但您示例中令人困惑的是 template<template <typename Foo> class Bar> class MyClass; 是完全合法的。我只是想指出这一点。 - NeXuS
显示剩余2条评论

2

使这种方法实用的一件事情是,在结构体中也可以使用friend关键字,因此私有成员只能被您想要修改它的特定函数、类或其他内容所使用和修改。这样,用户就无法自行修改这些部分。它们甚至不会出现在自动填充功能中,至少在Visual Studio中不会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接