两个问题~

wh62592855 2008-12-11 04:51:05
1,
今天在书中看到了所谓的“复制保护”,在代码中作者把复制构造函数和重载的赋值函数都定义为private,这有什么用呢?

2,
书里还有个名词是“类型欺骗”,请解释一下。

谢谢
最好有个小例子
...全文
207 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjundriver 2008-12-13
  • 打赏
  • 举报
回复
复制构造函数和赋值操作符,这两个函数,不声明为private,就不能明确地告诉你的用户,不能进行赋值构造和赋值,但是这两个函数进行声明就可以了,不用定义的
因为,你要禁止他调用,所以不用定义函数体。
如果不声明为private的话, 你进行用一个对象来构造另外一个对象的时候,函数就会自动给你生成一个拷贝构造函数,其访问级别为public:,那就不是你想要的,你想禁止复制构造,你就不声明且不定义,然而编译器就自动给你生成了一个;如果明确声明成了private了,那就明确告诉编译器不能拷贝构并且造编译器也拒绝给你生成一个拷贝构造函数了,对赋值操作符同样的道理。
wh62592855 2008-12-13
  • 打赏
  • 举报
回复
没人解答??
wh62592855 2008-12-13
  • 打赏
  • 举报
回复
呵呵 谢谢大家的回答 我明白了 结贴给分
xuruichen 2008-12-13
  • 打赏
  • 举报
回复
楼上正解,如果我们没有定义复制构造函数,编译器会为我们合成一个。与合成默认构造函数不同,即使我们定义了其他的构造函数,也会合成复制构造函数。
所以将复制构造函数只声明不定义(在private部分中)是很正确的(如果想将该类禁止复制赋值的话)。
赋值操作符和复制构造函数相似。
feng4206yu 2008-12-12
  • 打赏
  • 举报
回复
第二个问题"类型欺骗"倒是第一次听说,不过一听应该就是10楼楼主所说的将基类指针指向其子类对象这回事吧...大可不必拘泥于这样无端术语...
toadzw 2008-12-12
  • 打赏
  • 举报
回复
1.不允许复制吧?
复制构造不用说。
赋值时,实参传给形参也要调用复制构造,private直接不提供接口就好了。

2.类型欺骗? 是不是“从类的”和“到类的” 隐式转换之类的东西?
xuruichen 2008-12-12
  • 打赏
  • 举报
回复
将复制构造函数和赋值操作符写成PRIVATE还没见过,有什么用呢?
wh62592855 2008-12-12
  • 打赏
  • 举报
回复
呵呵 实在不好意思 例子记不太清楚了 书还图书馆了 只记了个这个抽象的名词“类型欺骗”
wh62592855 2008-12-12
  • 打赏
  • 举报
回复
!!!
wh62592855 2008-12-12
  • 打赏
  • 举报
回复
呵呵 我有点晕 按照你的意思是想禁止复制,那么既然禁止还定义这两个函数干什么
blainelee 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wh62592855 的回复:]
把赋值构造函数和重载的赋值操作符定义为私有的就不能在类外进行直接的访问,那么它还定义这两个函数有什么作用呢?
我个人的理解是这样的:程序中还是需要复制构造函数和对赋值符的重载,只不过程序不允许外部直接进行复制,而是通过其他一些方式,比如说在其他的成员函数
内部调用这两个函数。
不知道这样理解对不?
[/Quote]

定义这两个函数的目的就是把他们声明为private,如果代码中直接复制,比如 "Apple a = b", 编译器会报错,从而达到禁止复制的目的。

试想一下,如果不把这两个函数声明为private,怎么才能够禁止复制呢?
晕,不知道有没有解释清楚
wh62592855 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 pony_ml 的回复:]
类型欺骗
会不会是 operator()的重载问题
[/Quote]
operator()的重载? 用函数对象?
你具体是值什么?具体点。谢谢
SearchLife 2008-12-12
  • 打赏
  • 举报
回复
mark
pony_ml 2008-12-12
  • 打赏
  • 举报
回复
类型欺骗
会不会是 operator()的重载问题
wh62592855 2008-12-12
  • 打赏
  • 举报
回复
把赋值构造函数和重载的赋值操作符定义为私有的就不能在类外进行直接的访问,那么它还定义这两个函数有什么作用呢?
我个人的理解是这样的:程序中还是需要复制构造函数和对赋值符的重载,只不过程序不允许外部直接进行复制,而是通过其他一些方式,比如说在其他的成员函数
内部调用这两个函数。
不知道这样理解对不?
wh62592855 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wh62592855 的回复:]
引用 4 楼 bioexplore 的回复:
我只能回答你的第一个问题,第二个问题我第一次听说。
举个例子:
class Apple
{
private:
int size_;
int colorIndex_;
Apple(const Apple& a);
Apple operator=(const Apple& a);
public:
Apple();
};

int main()
{
Apple apple1;//调用public下的默认构造函数
Apple apple2(apple1);//试图调用private中的复制构造函数,提示编…
[/Quote]

同问!!
bfhtian 2008-12-12
  • 打赏
  • 举报
回复
lz把书上的例子写一下就好解释了
old-six-programmer 2008-12-11
  • 打赏
  • 举报
回复
一般来说这样的设计是针对将自己编写的代码提供给客户使用的情况
如果你不打算支持这样的操作,最好显式禁止
那当然是让它在编译期通不过了

而且这种方式一般都不提供函数实体
当然有些编译器会需要一个定义,那么就提供一个空的定义

如果需要内部调用,显然应该提供有效定义
那又另当别谈了
wh62592855 2008-12-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lann64 的回复:]
没听说过“类型欺骗”
[/Quote]
具体的例子记不太清了 书是图书馆借的 已经还了
好像是继承那方面的 就是用基类的指针指向派生类对象之类的
wh62592855 2008-12-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bioexplore 的回复:]
我只能回答你的第一个问题,第二个问题我第一次听说。
举个例子:
class Apple
{
private:
int size_;
int colorIndex_;
Apple(const Apple& a);
Apple operator=(const Apple& a);
public:
Apple();
};

int main()
{
Apple apple1;//调用public下的默认构造函数
Apple apple2(apple1);//试图调用private中的复制构造函数,提示编译错误
Apple apple3=app…
[/Quote]
我知道定义为私有的就不能在类外进行直接的访问,那么它还定义这两个函数有什么作用呢?
我个人的理解是这样的:程序中还是需要复制构造函数和对赋值符的重载,只不过程序不允许外部直接进行复制,而是通过其他一些方式,比如说在其他的成员函数
内部调用这两个函数。
不知道这样理解对不?
加载更多回复(8)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧