C++中怎么区别=调用的是拷贝构造函数还是拷贝赋值运算符

C++中如何区别=调用的是拷贝构造函数还是拷贝赋值运算符?
本帖最后由 NineTyNine_LP 于 2014-05-11 23:17:11 编辑
C++中如何区别=调用的是拷贝构造函数还是拷贝赋值运算符?
------解决方案--------------------
只要区分初始化和赋值就行了。。。

class A {};
A a1;
A a2 = a1;        //同类对象初始化,调用复制构造
A a3;
a3 = a1;            //赋值,调用=号重载的函数

------解决方案--------------------
初始化才会调用复制构造函数,其它的都调用赋值运算符。
------解决方案--------------------
当对象作为函数参数或都函数的返回值时,会调用复制构造函数,当对象显式用赋值操作符时,会调用赋值运算符

void fun(Object obj);// obj是传入参数的副本,会调用复制构造函数
Object obj2 =obj1; // 调用赋值运算符
------解决方案--------------------
像1楼说的.
你需要是的区分=号在不同的情况下的意思.

等号在定义变量的那一句语句中, 叫初始化, 这时候它不是一般的等号, 不是赋值.
例如: 
int a = 3;  
CString Str = TEXT("AAAA");  
char b = 'c';
char buf[0x10] = "abcde";



在其它地方就是普通的等号, 
例: 
int a;
a=3;

CString Str;
Str= TEXT("AAAA");

char b;
b = 'c';
------解决方案--------------------
在如下情况下,C++调用复制构造函数
1、 定义 同时 初始化(定义指占用内存行为)
2、 复制一个对象,将他作为实参传递给一个函数(按值传参)
3、 从函数返回时赋值一个对象
4、 初始化顺序容器的元素
5、 根据元素初始化列表初始化数据元素。

其他情况下,出现等号,均执行赋值操作符。

------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

------解决方案--------------------
如果以类名(不是引用,也不是指针)开始,就是拷贝构造,否则就是可能是赋值拷贝。
 

std::string a;
std::string b = a; //以类名std::string开始,拷贝构造
std::string c(a); //以类名std::string开始,拷贝构造
c = b; //不以类名std::string开始,赋值拷贝
std::string& d = a; //以std::string&开始, 没有拷贝,也没有赋值
void foo(std::string par);

foo(c); //相当于std::string par = c, 以类名开始,拷贝构造
void bar(std::string &par);
bar(c) // 相当于std::string& par = c, 以类名&开始,没有拷贝构造,也没有赋值