中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
关于成员和基类的构造函数
作者:未知 时间:2005-09-13 23:36 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:关于成员和基类的构造函数

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)

左大括号

右大括号

是错误的。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有