C++调用构造函数的方式
2015-05-26 14:59
204 查看
今天遇见了一个挺逗的问题,这个问题已经不是第一次绊脚了。放到这里,提醒自己的同时,也相信学习C++的朋友一定都会经历同样的问题。
还是老风格,先看代码:
编译器在自动合成构造函数的时候,会调用子类的默认构造函数。但是,我故意修改了子类A的构造函数,使编译器不会合成A的无参数的默认构造函数,导致B的默认构造函数无法合成。
我本意是想测试这样的错误。发现上面的代码居然可以顺利编译通过。
但是,我把第15行代码 B b(); 改成 B b; 发现,成功的触发了编译错误。
为什么呢?
在C++中调用构造函数的方式有如下几种:
A a = A();//调用默认构造函数
A a = A(xx);//调用带参的构造函数
A a(xx);//调用带参的构造函数的简写形式
A a;//调用默认构造函数的简写形式
我们学习东西的时候,不能随便迁移知识。
上面代码中第15行B b();其实是声明了一个函数,该函数没有参数,返回B类型的变量。整个过程没有类B变量的定义,所以没有触发编译器去合成B的构造函数,所以没有报错。
调用默认构造函数的方法只有两种,
A a = A();
或者它的简写形式:
A a;
而带参的简写形式不能应用在无参的构造式:
A a();
上面这个语句会被识别成无参的函数声明,函数名是a。
还是老风格,先看代码:
class A { public: A(int a) { } }; class B : public A { }; int main() { B b(); }
编译器在自动合成构造函数的时候,会调用子类的默认构造函数。但是,我故意修改了子类A的构造函数,使编译器不会合成A的无参数的默认构造函数,导致B的默认构造函数无法合成。
我本意是想测试这样的错误。发现上面的代码居然可以顺利编译通过。
但是,我把第15行代码 B b(); 改成 B b; 发现,成功的触发了编译错误。
为什么呢?
在C++中调用构造函数的方式有如下几种:
A a = A();//调用默认构造函数
A a = A(xx);//调用带参的构造函数
A a(xx);//调用带参的构造函数的简写形式
A a;//调用默认构造函数的简写形式
我们学习东西的时候,不能随便迁移知识。
上面代码中第15行B b();其实是声明了一个函数,该函数没有参数,返回B类型的变量。整个过程没有类B变量的定义,所以没有触发编译器去合成B的构造函数,所以没有报错。
调用默认构造函数的方法只有两种,
A a = A();
或者它的简写形式:
A a;
而带参的简写形式不能应用在无参的构造式:
A a();
上面这个语句会被识别成无参的函数声明,函数名是a。
相关文章推荐
- C++中构造函数调用与申明方式的关系
- 分析C++方式构造函数调用虚函数的问题
- c++:(各种)构造函数的调用方式
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- C#调用C(C++)dll示例教程,包含dll找不到函数入口的解决办法,包含C#dll调用方式不对出错的解决办法
- C++之析构函数和构造函数调用时间---补充(2)《Effective C++》
- Effective C++读书笔记---了解C++默默编写并调用哪些构造函数
- DLL调用的两种方式(IDE:VC6.0,C++)
- C#调用C++的DLL搜集整理的所有数据类型转换方式 (转)
- 从一道题谈C++中构造函数调用构造函数
- C++构造函数与析构函数的调用顺序
- C#调用C++的DLL 所有数据类型转换方式
- C/C++日常学习总结(第十三篇)默认构造函数内部再调用带参的构造函数
- C++ 多重继承时,构造函数调用秩序,有虚继承时,基类只调用几次?
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- C++ 继承中子类与父类虚函数入栈顺序 及父类私有虚函数的调用方式
- C++中关于构造函数调用次序的一道经典例题及对虚函数构造顺序的理解
- C# 调用C++的dll,通过DllImport方式。 from http://www.cnblogs.com/xiaokang088/archive/2011/04/08/2009673.html
- PASCAL FAR ----c++ 函数的调用方式
- C++继承中析构函数 构造函数的调用顺序以及虚析构函数