C++中构造函数调用构造函数
来源:互联网 发布:java中list是有序的吗 编辑:程序博客网 时间:2024/05/01 01:43
最近在整理C++知识的时候,突然想到如何在C++中实现构造函数调用构造函数的问题,常见的错误是按照如下方式来调用:
1: #include3: class Test4: {5: public:6: int m_a;8: Test(int a)9: {10: m_a = a;11: }13: Test()14: {15: Test(1);16: }17: };19: int main(int argc,char* argv[])20: {21: Test var;22: std::cout<<var.m_a<<std::endl;23: return 0;24: }
这段代码输出的是一个不确定的值,m_a的值并不是1,原因在于执行Test(1)时,并不是用这一构造函数来初始化当前的内存区,而是初始化了一个临时对象的内存区。
那么如何在C++中实现构造函数调用构造函数呢?
这里需要说明一下new的另一种new的表达式----定位new表达式(placement new),它的作用是在已分配的原始内存中初始化一个对象,它与new的其他版本不同之处在于它并不分配内存。
STL中的原型如下:
1: void * operator new (size_t, const std::nothrow_t &) throw();2: void * operator new (size_t, void *) throw();3: void * operator new[] (size_t, const std::nothrow_t &) throw();4: void * operator new[] (size_t, void *) throw();
该表达式的形式如下:
1: new (place_address) type2: new (place_address) type (initializer-list)
其中place_address必须是一个指针,而intializer-list提供了(可能为空的)初始化立标,以便在构造新分配的对象时使用。
对于上面的例子,我们可以使用定位new表达式来完成构造函数之间的调用:
1: Test()2: {3: new (this) Test(1);4: }
最后,对于构造函数相互调用的问题,可以考虑一下两点建议:
1)可以考虑使用构造函数的默认参数来减少这种调用方式。
2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可。
0 0
- C++:构造函数中调用虚函数
- C++:构造函数中调用虚函数
- 在构造函数中调用构造函数
- 在构造函数中调用构造函数
- C++中构造函数调用构造函数
- C++中构造函数调用构造函数
- C++中构造函数调用构造函数
- C++构造函数中调用构造函数
- Java构造函数中调用构造函数
- C++中构造函数调用构造函数
- c++中构造函数调用构造函数
- C++中构造函数调用构造函数
- C++中构造函数调用构造函数
- 构造函数调用构造函数
- 构造函数调用构造函数
- 构造函数调用构造函数
- C++构造函数调用其他构造函数
- c++:在类的构造函数中调用另一个构造函数
- UTF-8与UTF-8无BOM的区别
- UVA1586解题报告
- 蓝鸥Unity开发基础——值类型和引用类型
- Java变量以及内存分配(非常重要)
- 安装虚拟机VMware的过程
- C++中构造函数调用构造函数
- Elasticsearch索引管理
- 机器学习算法3——朴素贝叶斯
- Linux认识与简单操作
- EasyAR尝鲜系列教程之视频播放功能的实现
- pcDuino day2
- CF366A Dima and Guards
- LightOJ 1282 Leading and Trailing
- 15个必须知道的chrome开发者技巧