c++构造函数类型的讲解

11 篇文章 1 订阅
// 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;
 }

};


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
*/

/*是引用的时候

*/
}
附加:1)容易混淆点
  Memory m5; m5=f(); //此语句调用函数f,f反回一个对象,在反回时会调用复制构造函数生成一个临时对象,并把这个临时对象作为默认赋值操作符的一个参数,因此这里不但调用了复制构造函数还调用了赋值操作符。
  cout<<m5.a<<m5.b<<"\n";
  Memory m6; m6=m; //把m的值赋给m6,注意这里不会调用复制构造函数,也不会生成临时对象,因为这里会把m当成是默赋值操作符的一个参数,调用的是默认赋值操作符。}

2)理解赋值与复制初始化的区别(重点):赋 值是在两个已存在的对象间进行的,也就是用一个已存在的对象去改变另一个已存在对象的值。赋值将调用赋值操作符对对象进行操作,赋值操作符将在操作符重载 中讲解。比如有类hyong,有语句hyong x(1);hyong  y(1,2)则x=y;这就是赋值,因为对象x和y是已经存在的对象,而语句hyong  x=y;则是复制初始化,是用一个已存在的象y去创建一个新对象x,所以是复制初始化。

3)何时生成临时对象:
情形1:
按值传递对象注意是按值传递对象,按值传递意味着会创建一个原始对象的副本来进行值的传递。  
情形2:
函数返回对象时。
情形3:用一个对象初始化另一个对象时即复制初始化,语句A x=y和A x=A(y)这里y是hyong类型的对象。都将调用复制构造函数,但有可能创建临时对象也有可能不创建临时对象而用复制构造函数直接初始化对象,这取决于编译器。

4)何时使用复制构造函数:
在C++中,下面三种对象需要调用复制构造函数:
1) 一个对象以值传递的方式传入函数体;   
2) 一个对象以值传递的方式从函数体返回;   
3) 一个对象需要通过另外一个对象进行初始化;
5)复制初始化与复制构造函数:
  复制初始化使用=等于符号来初始 化,复制初始化也是创建一个新对象,并且其初值来自于另一个已存在的对象,复制初始化总是调用复制构造函数来初始化的,复制初始化时首先使用指定的构造函 数创建一个临时对象,然后用复制构造函数将临时对象的每个非static成员依次的复制到新创建的对象。复制构造函数执行的是逐个成员初始化。注意这里是 用一个已存在的对象创建另一个新对象,与用构造函数直接创建一个新对象不一样,使用构造函数初始化时不会使用另一个对象。比如有类Memory,则语句Memory m(1,2)调用构造函数直接初始化,而语句Memory n=m则是用已存在的对象m去初始化一个新对象n,属于复制初始化。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值