构造函数和赋值运算符的疑问

littleroy 2003-07-25 08:35:28
赋值运算符和拷贝构造函数的区别(钱能的c++程序设计教程的疑问)???

在p410有如下语句(原话):
///////////////////////////////////////////////////////

void fn(myclass& mc)
{
myclass newmc = mc; //这是考贝构造函数
newmc = mc; //这是赋值运算符
}
当考贝构造函数执行时,newmc对象还不存在,拷贝构造函数起初始化的作用。当赋值运算符在newmc上执行时

,它已经是一个myclass对象了

///////////////////////////////////////////////////////////
疑问1:拷贝构造函数和赋值运算符的工作不都一样吗,拷贝构造函数执行时,也执行赋值了啊
疑问2: stl中容器中的元素所谓的“可构造”和“可赋值”是什么意思??
...全文
48 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
leeseon 2003-07-27
  • 打赏
  • 举报
回复
疑问2: stl中容器中的元素所谓的“可构造”和“可赋值”是什么意思??

对于用于STL容器的元素,必然是可以通过未拷贝构造函数进行复制的,可以用=号来进行赋值动作的,也能通过析构来完成销毁工作的(见c++标准库p134),不过一般的类就自然天然具有这些属性,只是对于具有自己资源的类要提供自己定义的这三个函数。
leeseon 2003-07-27
  • 打赏
  • 举报
回复
正如

int n = 0;
与int n;
n=0;
是不一样的一个

前一个是声明加初始化,后一个是声明再赋值,这两者的区别,其实也就是你所问的区别的!

同时也正如 int n=0;与int n(0);的语义是一样的,所以你的问题的第一个自然调用的是拷贝构造函数,另一个却是调用赋值运算。
fierygnu 2003-07-27
  • 打赏
  • 举报
回复
假设赋值运算符没有定义,就调用缺省的赋值运算符,即完全的值拷贝赋值。
声明:有一个变量。
定义:变量在这里。
初始化:给变量确定的初值。
赋值:给变量赋一个值。
构造:对一块raw memory(定义时分配的未初始化的内存)进行处理,使其拥有确定的值和状态的过程。
littleroy 2003-07-27
  • 打赏
  • 举报
回复
哦,
原来这样,那么你们的意思是:
构造函数有"定义并初始化的功能",,而"赋值运算符"没有????

当定义并初始化并赋值时,调用的是构造函数:
myclass mc1 = mc2;

mc1 = mc2;
调用的是赋值运算符,,,

那假设赋值运算符没有定义,就调用构造函数???

另外请问如何精确解释几个术语:
"声明"
"定义"
"初始化"
"赋值"
"构造"





lieyanfriend 2003-07-26
  • 打赏
  • 举报
回复
解答一:两者不一样的。主要的区别在于拷贝构造函数调用的函数是不一样了,一个调用的是:TCLASS(const TCLASS&);而另一个调用的是:operator=。
我想你关于这一点的疑问应该是在这里:你不明白的是两者都是用“=”的,为什么调用的函数会不同呢?这是因为一个是在定义的时候用“=”,那其实是构造,一个则是真正的赋值,这两者是有区别的。
解答二:关于可构造和可赋值我只能说这是元素的两种获取值的方式,既然都“可”了,那就是可以用呗。
还是你想问其它的?那能不能请你再说详细一点?
代码之诗 2003-07-26
  • 打赏
  • 举报
回复
偶来续 lieyanfriend(黄奇) 的话:

所以,为了比较明确的区分这两种情况,建议对任何非平凡(non-plain)的类定义用函数调用式语法,如楼主的:

myclass newmc = mc;

写成:

myclass newmc(mc);

对于编译器来说,它们是完全一样的,可是对于人来说,这就与赋值的情况有明确的区分了。
darcymei 2003-07-26
  • 打赏
  • 举报
回复
刚才调了一下,纠正一下自己的说法,无论myclass有没有缺省构造函数在第一步时都会调用拷贝构造函数...
darcymei 2003-07-25
  • 打赏
  • 举报
回复
myclass估计没缺省构造函数吧!所以这样写是调用拷贝构造函数
《高质量C++编程指南》 软件质量是被大多数程序员挂在嘴上而不是放在心上的东西! 除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C++/C程序怎么会有那么多的毛病?” 别难过,作者只不过比你早几年、多几次惊慌而已。 请花一两个小时认真阅读这本百页经书,你将会获益匪浅,这是前面N-1个读者的建议。 首先请做附录B的C++/C试题(不要看答案),考查自己的编程质量究竟如何。然后参照答案严格打分。 (1)如果你只得了几十分,请不要声张,也不要太难过。编程质量差往往是由于不良习惯造成的,与人的智力、能力没有多大关系,还是有药可救的。成绩越差,可以进步的空间就越大,中国不就是在落后中赶超发达资本主义国家吗?只要你能下决心改掉不良的编程习惯,第二次考试就能及格了。 (2)如果你考及格了,表明你的技术基础不错,希望你能虚心学习、不断进步。如果你还没有找到合适的工作单位,不妨到上海贝尔试一试。 (3)如果你考出85分以上的好成绩,你有义务和资格为你所在的团队作“C++/C编程”培训。希望你能和我们多多交流、相互促进。半年前我曾经发现一颗好苗子,就把他挖到我们小组来。 (4)如果你在没有任何提示的情况下考了满分,希望你能收我做你的徒弟。 前 言 5 第1章 文件结构 10 1.1 版权和版本的声明 10 1.2 头文件的结构 11 1.3 定义文件的结构 12 1.4 头文件的作用 12 1.5 目录结构 13 第2章 程序的版式 14 2.1 空行 14 2.2 代码行 15 2.3 代码行内的空格 16 2.4 对齐 17 2.5 长行拆分 18 2.6 修饰符的位置 18 2.7 注释 19 2.8 类的版式 20 第3章 命名规则 21 3.1 共性规则 21 3.2 简单的WINDOWS应用程序命名规则 22 3.3 简单的UNIX应用程序命名规则 24 第4章 表达式和基本语句 25 4.1 运算符的优先级 25 4.2 复合表达式 26 4.3 IF 语句 26 4.4 循环语句的效率 28 4.5 FOR 语句的循环控制变量 29 4.6 SWITCH语句 29 4.7 GOTO语句 30 第5章 常量 32 5.1 为什么需要常量 32 5.2 CONST 与 #DEFINE的比较 32 5.3 常量定义规则 32 5.4 类中的常量 33 第6章 函数设计 35 6.1 参数的规则 35 6.2 返回值的规则 36 6.3 函数内部实现的规则 38 6.4 其它建议 39 6.5 使用断言 40 6.6 引用与指针的比较 41 第7章 内存管理 43 7.1内存分配方式 43 7.2常见的内存错误及其对策 43 7.3指针与数组的对比 44 7.4指针参数是如何传递内存的? 46 7.5 FREE和DELETE把指针怎么啦? 49 7.6 动态内存会被自动释放吗? 49 7.7 杜绝“野指针” 50 7.8 有了MALLOC/FREE为什么还要NEW/DELETE ? 51 7.9 内存耗尽怎么办? 52 7.10 MALLOC/FREE 的使用要点 53 7.11 NEW/DELETE 的使用要点 54 7.12 一些心得体会 55 第8章 C++函数的高级特性 56 8.1 函数重载的概念 56 8.2 成员函数的重载、覆盖与隐藏 59 8.3 参数的缺省值 62 8.4 运算符重载 63 8.5 函数内联 64 8.6 一些心得体会 67 第9章 类的构造函数、析构函数与赋值函数 68 9.1 构造函数与析构函数的起源 68 9.2 构造函数的初始化表 69 9.3 构造和析构的次序 71 9.4 示例:类STRING的构造函数与析构函数 71 9.5 不要轻视拷贝构造函数赋值函数 72 9.6 示例:类STRING的拷贝构造函数赋值函数 72 9.7 偷懒的办法处理拷贝构造函数赋值函数 74 9.8 如何在派生类中实现类的基本函数 74 9.9 一些心得体会 76 第10章 类的继承与组合 77 10.1 继承 77 10.2 组合 79 第11章 其它编程经验 81 11.1 使用CONST提高函数的健壮性 81 11.2 提高程序的效率 83 11.3 一些有益的建议 84 参考文献 86 附录A :C++/C代码审查表 87 附录B :C++/C试题 92 附录C :C++/C试题的答案与评分标准 96

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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