在分配对象私有时使用c++
c++ when assigning an object private
all。我是c++的新手,我想问一个关于分配对象的问题。
例如我有两个来自同一类的对象,a1和a2。如果类中有一些私人成员
我们为什么能这样做作业a1=a2;
我的问题是,我认为只有成员职能才有权力要更改私人成员数据的内容,请执行以下步骤我只是浏览了一下,私人会员数据很容易更改。为什么??
可以使用operator=
成员函数执行分配,根据定义,该函数可以访问私有成员。
当你没有定义一个时,会提供一个默认值:"默认版本执行成员复制,其中每个成员都由自己的复制赋值运算符(也可能是程序员声明的或编译器生成的(复制。"。
你说得对。但在您概述的情况下,您调用a1的成员函数。公共成员函数YourClass& operator=(const <YourClass>& rightHandSide)
是特定的。如果你不是自己提供的,编译器会自动生成这样一个方法。如果您想阻止编译器生成一个,并且严格不希望以上述方式进行赋值,只需声明operator=
为private,并且根本不提供定义。这将导致编译器在a1 = a2
处抱怨。
另一个可能令人困惑的问题是方法operator=
究竟如何读取rhs的私有数据。这正是Luchian Grigore所概述的:它们对类是私有的,而不是对实例。
调用程序不知道除了"对象"之外要复制什么。打电话的人根本不知道有任何私人成员。赋值运算符是公共的,任何公共方法的行为都是一样的——公共方法当然可以修改私有成员。
私有成员和方法仅限于类,而不限于特定实例。您可以从同一类的对象访问不同类实例中的私有成员。这种行为是经过设计的,并得到了标准的保证。
如果您还没有覆盖赋值运算符(A& A::operator = (const A& other)
(,那么您很可能正在执行浅层复制。
a1=a2;在这种情况下,调用a1对象(即目标对象(的隐式"复制赋值运算符",该运算符是公共的,并且存在于a1和a2中。"复制赋值操作符"的工作是将所有数据成员从一个对象复制到另一个对象。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源