一个类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;之前尚未进行定义,所以这里会先调用默认构造函数,然后再进行赋值。
最后自己测试了一下:
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 };
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 };
#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=)