在构造函数中调用构造函数
来源:互联网 发布:梦想海贼王进化数据 编辑:程序博客网 时间:2024/04/30 22:29
首先明确一点:直接调用构造函数,只有一个作用,就是在栈上构造一个临时对象。
所以构造函数的互相调用引起的后果不是死循环,而是栈溢出。理论上,不允许在某个构造函数中调用其他构造函数。除非有特别的功能需求。
假设一个类
class A
{
public:
A();
A(int i);
~A();
}
假设实现是这样的:
A::A()
{
A(0); //注意
}
A::A(int i)
{
}
A::~A()
{
}
在 //注意 处的代码,其实执行了这样的操作:
在栈上开辟空间,构造一个A的实例。
然后对象被释放,这个释放有可能在函数结束前就进行了。
最终跟踪到的结果是这样:
A()被调用
A(int i)被调用
~A()被调用
//.....
上面那个~A()让很多人迷惑,其实这只是那个临时对象释放而已。
这个临时对象,在大多数场合不产生任何有功能的影响力。
这种调用,往往被很多人误解,以为可以通过构造函数的重载和相互调用实现一些类似默认参数的功能,其实是不行的,而且往往有副作用。
而同一个类的构造函数又不能写在初始化成员列表里面,那怎么样才能实现这种需求呢?
偶只知道一个方法:
额外增加一个Init函数,在不同的构造函数中用不同的参数调用这个函数即可。
虽然不够优雅,但是勉强够用了。
注:还可以通过placement new实现
所以构造函数的互相调用引起的后果不是死循环,而是栈溢出。理论上,不允许在某个构造函数中调用其他构造函数。除非有特别的功能需求。
假设一个类
class A
{
public:
A();
A(int i);
~A();
}
假设实现是这样的:
A::A()
{
A(0); //注意
}
A::A(int i)
{
}
A::~A()
{
}
在 //注意 处的代码,其实执行了这样的操作:
在栈上开辟空间,构造一个A的实例。
然后对象被释放,这个释放有可能在函数结束前就进行了。
最终跟踪到的结果是这样:
A()被调用
A(int i)被调用
~A()被调用
//.....
上面那个~A()让很多人迷惑,其实这只是那个临时对象释放而已。
这个临时对象,在大多数场合不产生任何有功能的影响力。
这种调用,往往被很多人误解,以为可以通过构造函数的重载和相互调用实现一些类似默认参数的功能,其实是不行的,而且往往有副作用。
而同一个类的构造函数又不能写在初始化成员列表里面,那怎么样才能实现这种需求呢?
偶只知道一个方法:
额外增加一个Init函数,在不同的构造函数中用不同的参数调用这个函数即可。
虽然不够优雅,但是勉强够用了。
注:还可以通过placement new实现
- 在构造函数中调用构造函数
- 在构造函数中调用构造函数
- 在成员函数中调用构造函数
- 在构造函数中调用虚函数
- 在构造函数中调用虚函数
- 禁止:C++在构造函数中调用构造函数
- C++中构造函数调用构造函数
- C++中构造函数调用构造函数
- C++中构造函数调用构造函数
- C++构造函数中调用构造函数
- Java构造函数中调用构造函数
- C++中构造函数调用构造函数
- c++中构造函数调用构造函数
- C++中构造函数调用构造函数
- C++中构造函数调用构造函数
- 在构造函数/析构函数中调用虚函数
- 在构造函数/析构函数中调用虚函数
- 构造函数调用构造函数
- Java and C# NOTE
- 变长参数函数
- 在SQL Server 2005 中使用.net程序集的一项注意
- STL随感
- 从二进制的角度看对象
- 在构造函数中调用构造函数
- CString,string,char*, int之间的常用转换
- placement new
- 函数内静态成员——线程不安全
- SQL Server 2005 中的分区表和索引(中文版)
- 最小树形图
- wxpython 编译
- 数据访问的封装
- 跨模块