(已解决一部分)哪位对类的构造函数内的成员变量的初始化过程比较熟悉~帮忙看个问题
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(无增加代码)
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=)
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=)
相关文章推荐
- 成员变量、this和super问题、类的初始化过程问题
- 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)
- 构造函数中成员变量初始化顺序问题
- 没有默认构造函数的问题, 对于类成员变量有别的类成员,则在类 构造函数中也必须对那个类成员变量进行初始化,除非那个类 成员有默认构造函数
- Java初始化顺序总结及其程序执行过程图- 静态变量、静态代码块、成员变量、构造函数
- java中解决构造函数中成员变量和形参重名的问题
- 构造函数初始化成员变量问题
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- c++中成员变量初始化问题
- 【thinkphp】解决IF标签变量与变量比较出现的问题
- 解决VS2012 WPF中“对类型“ ”的构造函数执行符合制定的绑定约束的调用时引发了异常。行号为“3”,行位置为“9””问题的过程
- Java中成员变量的初始化过程
- C++使用初始化清单和直接在构造函数内初始化成员变量的区别
- 解决C++全局变量只能初始化不能赋值的问题
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
- C++成员变量的初始化顺序问题
- C++ 成员变量的初始化与构造函数
- C/C++基础问答(1):通过初始化列表和构造函数内赋值初始化成员变量的区别
- 在制作静态生成的过程中遇到问题了,大家帮忙解决一下吧!!
- 局部变量与成员变量的同名问题&显示初始化