C++私人成员是否可访问
C++ private members accessible?
我在使用C++的signals类中有这个项目。当我看到这个时,我正在修改我们的教官代码:
ListData::ListData(const ListData& newlist)
: Data(), nbNodes(newlist.nbNodes) {}
正如他所说,这是一个"复制构造函数",应该大致相当于以下内容:
ListData::ListData(const ListData& newlist){
Data = "";
//copy nbNodes of newList to current instance
nbNodes = newlist.nbNodes;
}
但令我困扰的是,nbNodes
是一个私人会员如果传递的newList
的nbNodes
是私有的,该构造函数如何访问它
私有成员的一个有趣之处在于,同一类型的两个对象可以自由访问彼此的私有成员。你可以把它想象成一个阶级总是与自己交朋友。由于这是ListData
的构造函数,而newlist
也是ListData
,所以您可以很好地访问它的private。
这里有一个例子:
#include <iostream>
class foo
{
public:
foo() { }
foo(std::string secret) : secret(secret) { }
void steal_secret(const foo& other) { secret = other.secret; }
std::string get_secret() { return secret; }
private:
std::string secret;
};
int main() {
foo f1("I'm actually a bar");
foo f2;
f2.steal_secret(f1);
std::cout << f2.get_secret() << std::endl;
return 0;
}
f2
愉快而轻松地从f1
窃取secret
,尽管它是私有的。
允许这样做的原因很简单,因为private
并不意味着对对象是私有的,它意味着对类是私有的。这简化了诸如复制构造函数之类的函数的实现,这些函数需要对同一类的两个对象的内部进行一些工作。
该规则来自private
(§11/1(的定义:
一个类的成员可以是
private
;也就是说,它的名称只能由声明它的类的成员和朋友使用- […]
请注意,它是根据类而不是对象来定义的。
private
关键字具有类语义而非对象语义。因此,一个类的对象的私有成员可以访问同一类的其他对象。
nbNodes
对ListData
类是私有的,而不是对该类的特定实例。因此,在类的代码中,您可以看到该类的其他实例的私有数据。
如果不是这样,每个类都必须为每个数据成员导出"getter",以便执行副本构造和副本分配。
复制构造函数与任何其他方法一样:由于您可以从一个类的方法访问该类的私有成员,因此您可以对复制构造函数执行同样的操作(否则,如何将实例的状态复制到另一个类?(。
具有private
可见性的成员是只能在其所属类的成员函数内访问的成员,而不限制对象。
如果函数f()
是类C
的成员函数,则它可以访问C
的任何实例的private
成员,而不仅仅是隐式this
指针所指向的成员(当然,这也使这对根本不接收this
指针的static
函数有效(。
来自C++标准,第11章:成员访问控制:
私有;也就是说,它的名称只能由的成员和朋友使用在其中声明它的类。
这意味着私有成员可以被该类的任何成员访问
这里ListData::ListData(const ListData& newlist)
是ListData的复制构造函数,它是一个成员函数,因此可以访问类ListData的私有成员。
- 函数是否可以访问传递给main()的参数
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 成员访问是否在空指针上定义C++?
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 是否可以使用指针访问变量以避免直接编辑变量?
- VS2017 是否更改了 C++ 中访问 C# 命名空间的方式?
- 通过指针访问是否如此昂贵
- 持续的时间访问是否在某个时候意味着连续内存
- clang或gcc关于这个内部类成员访问是否正确
- 数组中的二叉搜索访问是否比使用哈希表更快
- 对共享变量的无保护访问是否总是数据竞赛
- 将多维C++数组作为一个连续块(堆上)访问是否有效
- 通过shared_ptr访问是否比原始指针更污染缓存行
- std::原子访问是否充当内存屏障
- 一行中对同一类成员的多个访问是否以某种方式进行了优化