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

一个类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;之前尚未进行定义,所以这里会先调用默认构造函数,然后再进行赋值。

最后自己测试了一下:

BaseClass.h
 1 #pragma once
2 #include <iostream>
3
4 class BaseClass
5 {
6 public:
7 BaseClass(void) ;
8 BaseClass(const BaseClass& rhs) { _iBase = rhs._iBase; std::cout << "copy constructor" << std::endl; }
9 BaseClass& operator=(const BaseClass& rhs) { _iBase = rhs._iBase; std::cout << "assignment constructor" << std::endl; return *this;}
10 ~BaseClass(void);
11
12 private:
13 int _iBase;
14 };
BaseClass.cpp
 1 #include "StdAfx.h"
2 #include "BaseClass.h"
3
4 BaseClass::BaseClass(void)
5 {
6 _iBase = 0;
7 std::cout << "default constructor" << std::endl;
8 }
9
10 BaseClass::~BaseClass(void)
11 {
12 }
 1 #pragma once
2 #include "BaseClass.h"
3
4 class TestClass
5 {
6 public:
7 TestClass(void);
8 // TestClass( const BaseClass& val ) { _val = val; }
9 TestClass( const BaseClass& val) : _val( val ) {}
10 ~TestClass(void);
11
12 private:
13 BaseClass _val;
14 };
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=)

原文地址:https://www.cnblogs.com/ziyoudefeng/p/2410728.html