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

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

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

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

,它已经是一个myclass对象了

///////////////////////////////////////////////////////////
疑问1:拷贝构造函数和赋值运算符的工作不都一样吗,拷贝构造函数执行时,也执行赋值了啊
疑问2: stl中容器中的元素所谓的“可构造”和“可赋值”是什么意思??
...全文
95 8 打赏 收藏 转发到动态 举报
写回复
用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估计没缺省构造函数吧!所以这样写是调用拷贝构造函数

24,853

社区成员

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

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