1。测试代码: #include class part{ public: part(std::string str){ // throw std::exception("在part对象的构造函数中抛出了一个异常!"); std::cerr << "构造一个part类型的对象,name is:"< } ~part(){ std::cerr<<"析构一个part类型的对象"<<:endl; } }; class base{ public: base(std::string str){ // throw std::exception("在base对象的构造函数中抛出了一个异常!"); std::cerr << "构造一个base类型的对象,name is:"< } ~base(){ std::cerr<<"析构一个base类型的对象"<<:endl; } part baseP; }; class derived:public base{ public: derived(std::string str):base(str){ p=part(str); throw std::exception("在derived对象的构造函数中抛出了一个异常!"); std::cerr << "构造一个derived类型的对象,name is :"< } ~derived(){ std::cerr<<"析构一个derived类型的对象"<<:endl; } part p; }; int main() { try{ derived d("test"); } catch (...) { } return 0; } 会报错: error C2512: 'part' : no appropriate default constructor available 解释:成员的构造函数将在容器类本身的构造函数的体执行之前首先执行, derived::derived(std::string str):base(str),p(str) 左大括号 右大括号
如果在体之前没有p(str)的话,会调用默认构造函数,又因为没有合适的默认构造函数,所以会报错。 如果在 derived::derived(std::string str) 左大括号 p=part(str); 右大括号 则实际上p对象已经存在,是复制赋值,而不是复制构造。 2。派生类的构造函数只能描述它自己的成员和自己的直接基类的初始式,它不能直接去初始化基类的成员。 所以如果写derived::derived(std::string str) baseP(str) 左大括号 右大括号
是错误的。 |