两个问题~

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

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

谢谢
最好有个小例子
...全文
206 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)
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

65,210

社区成员

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

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