您的位置:首页 > 其它

(已解决一部分)哪位对类的构造函数内的成员变量的初始化过程比较熟悉~帮忙看个问题

2012-03-21 22:21 267 查看
一个类A定义如下:

template <typename valType>

class A {

private:

  valType _val;

};

然后主要的问题是下面两个拷贝构造函数的区别:

  第一种构造:

  template <typename valType>

  inline

  A<valType>::A( const valType &val )

  {

    _val = val;

  }

  第二种构造:

  template <typename valType>

  inline

  A<valType>::A( const valType &val ) : _val( val ) {}

针对这两种拷贝构造:

1、A<int> a(1);时这两种没什么区别

2、但如果是A<Matrix> a( refMatrix );//这里Matrix是一个class对象

  Essential C++ P174说这里这两个效率就有高下之分了。因为,constructor函数主题内对_val 的赋值操作可分解为两个步骤:(1) 函数主题执行前,Matrix's default constructor 会先作用于_val 身上;(2) 函数主题内会以copy assignment operator 将val 复制给_val。但如果我们采用上述第二种方法,在constructor的member initilization list中将_val 初始化,那么只需一个步骤就可完成工作:以copy constructor 将val 复制给_val。

问题:

这里的红色标记地方我就不懂了。我的理解是A<Matrix> a( refMatrix );是声明a并定义a。在定义过程中会对a进行初始化,如果采用上述第一种构造方法,此时_val是一个class对象,而_val尚未进行定义,因此_val = val;是以Matrix类的copy constructor来进行的。

哪位能给解释解释上面其他颜色标记的那段话?

  

--------------------

一堆问题:这个看不懂,就又想起之前的Essential C++ P105

class A {

public:

  A();

  A( int len );

  A( int len, int beg_pos );

private:

  int _length;

  int _beg_pos;

};

A ta = 8;

上述语句是调用constructor还是assignment operator?答案是constructor

群里朋友的一种解释是:_val是class object,在_val = val;之前尚未进行定义,所以这里会先调用默认构造函数,然后再进行赋值。

最后自己测试了一下:

TestClass.cpp(无增加代码)

#include "StdAfx.h"
#include "TestClass.h"

TestClass::TestClass(void)
{
}

TestClass::~TestClass(void)
{
}


main函数主题:

  BaseClass bc;
  TestClass tc(bc);

运行结果:

  default constructor
  copy constructor
  请按任意键继续. . .

我现在自己对这个问题的解释倾向于:_val在构造函数主体内尚未定义,所以会调用默认构造函数。

  PPS:

构造函数执行过程是先执行初始化列表,然后是函数体内的代码。初始化列表的形式其实是调用的对应的构造函数。然后函数体内的_val = val; 这里是显示调用=操作符。但由于_val还没有定义,所以要先调用默认构造函数。。

2012/3/22增加:

本以为已经懂了,但昨晚聊天的最后之前的群里朋友又说:

string s1;

string s3 = s1;// 这一句直接调用copy构造。。

这里还是不理解,先标记红色。(在C++ Primer里没找到相关内容~string的文件里也没找到operator=)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐