// complex.cpp : 定义控制台应用程序的入口点。
//
//
#include "stdafx.h"
#include <iostream>
class complex
{
private:
double m_real;
double m_image;
public:
//complex(); //普通的拷贝构造函数
complex() //无参数构造函数
{
this->m_real =0;
this->m_image = 0;
std::cout << "I am no perfance function " << std::endl;
}
complex(const double &a_r, const double &b_i) //有残拷贝构造函数
{
this->m_real = a_r;
this->m_image = b_i;
std::cout << "I am two perfance function " << std::endl;
}
complex(const complex &m_cpex) //复制构造函数 ,防止有深拷贝的情况
{
this->m_real = m_cpex.m_real;
this->m_image = m_cpex.m_image;
std::cout << "I am copy perfance function " << std::endl;
}
complex &operator = (const complex &rhs) //等号运算符操作
{
if (this == &rhs)
{
return *this;
}
this->m_real = rhs.m_real;
this->m_image = rhs.m_image;
std::cout << "I am =fuzhi perfance function " << std::endl;
return *this;
}
#include <iostream>
class complex
{
private:
double m_real;
double m_image;
public:
//complex(); //普通的拷贝构造函数
complex() //无参数构造函数
{
this->m_real =0;
this->m_image = 0;
std::cout << "I am no perfance function " << std::endl;
}
complex(const double &a_r, const double &b_i) //有残拷贝构造函数
{
this->m_real = a_r;
this->m_image = b_i;
std::cout << "I am two perfance function " << std::endl;
}
complex(const complex &m_cpex) //复制构造函数 ,防止有深拷贝的情况
{
this->m_real = m_cpex.m_real;
this->m_image = m_cpex.m_image;
std::cout << "I am copy perfance function " << std::endl;
}
complex &operator = (const complex &rhs) //等号运算符操作
{
if (this == &rhs)
{
return *this;
}
this->m_real = rhs.m_real;
this->m_image = rhs.m_image;
std::cout << "I am =fuzhi perfance function " << std::endl;
return *this;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//测试无参数
complex c1, c2;
complex c3(1.1,2.2);
c1 = c3; //调用等号运算符
complex c4(c3);
complex c5 = c3; //调用的复制构造
return 0;
//有参数为不是引用的时候
/*I am no perfance function
I am no perfance function
I am two perfance function
I am =fuzhi perfance function
I am copy perfance function
I am copy perfance function
*/
/*I am no perfance function
I am no perfance function
I am two perfance function
I am =fuzhi perfance function
I am copy perfance function
I am copy perfance function
*/
/*是引用的时候
*/
}
}
附加:1)容易混淆点
Memory m5; m5=f(); //此语句调用函数f,f反回一个对象,在反回时会调用复制构造函数生成一个临时对象,并把这个临时对象作为默认赋值操作符的一个参数,因此这里不但调用了复制构造函数还调用了赋值操作符。
cout<<m5.a<<m5.b<<"\n";
Memory m6; m6=m; //把m的值赋给m6,注意这里不会调用复制构造函数,也不会生成临时对象,因为这里会把m当成是默赋值操作符的一个参数,调用的是默认赋值操作符。}
cout<<m5.a<<m5.b<<"\n";
Memory m6; m6=m; //把m的值赋给m6,注意这里不会调用复制构造函数,也不会生成临时对象,因为这里会把m当成是默赋值操作符的一个参数,调用的是默认赋值操作符。}
3)何时生成临时对象:
情形1:按值传递对象注意是按值传递对象,按值传递意味着会创建一个原始对象的副本来进行值的传递。
情形2:函数返回对象时。
情形3:用一个对象初始化另一个对象时即复制初始化,语句A x=y和A x=A(y)这里y是hyong类型的对象。都将调用复制构造函数,但有可能创建临时对象也有可能不创建临时对象而用复制构造函数直接初始化对象,这取决于编译器。
情形1:按值传递对象注意是按值传递对象,按值传递意味着会创建一个原始对象的副本来进行值的传递。
情形2:函数返回对象时。
情形3:用一个对象初始化另一个对象时即复制初始化,语句A x=y和A x=A(y)这里y是hyong类型的对象。都将调用复制构造函数,但有可能创建临时对象也有可能不创建临时对象而用复制构造函数直接初始化对象,这取决于编译器。
4)何时使用复制构造函数:
在C++中,下面三种对象需要调用复制构造函数:
1) 一个对象以值传递的方式传入函数体;
2) 一个对象以值传递的方式从函数体返回;
3) 一个对象需要通过另外一个对象进行初始化;
在C++中,下面三种对象需要调用复制构造函数:
1) 一个对象以值传递的方式传入函数体;
2) 一个对象以值传递的方式从函数体返回;
3) 一个对象需要通过另外一个对象进行初始化;
5)复制初始化与复制构造函数:
复制初始化使用=等于符号来初始 化,复制初始化也是创建一个新对象,并且其初值来自于另一个已存在的对象,复制初始化总是调用复制构造函数来初始化的,复制初始化时首先使用指定的构造函 数创建一个临时对象,然后用复制构造函数将临时对象的每个非static成员依次的复制到新创建的对象。复制构造函数执行的是逐个成员初始化。注意这里是 用一个已存在的对象创建另一个新对象,与用构造函数直接创建一个新对象不一样,使用构造函数初始化时不会使用另一个对象。比如有类Memory,则语句Memory m(1,2)调用构造函数直接初始化,而语句Memory n=m则是用已存在的对象m去初始化一个新对象n,属于复制初始化。