| 网站首页 | 测试咨讯 | 新手入门 | 专注性能 | 测试技术 | 测试管理 | 测试工具 | 开发社区 | 工具下载 | 资料下载 | 测试论坛 | 

[CNTester联盟群]交流群:34446273/21968356/64461572 白盒群:18400216 自动化群:2706508 性能群:4498858 外包群:59649884 管理群(需有管理经验):64442523

新手入门
 入门指南
 经验之谈
测试咨讯
 行业新闻
 网站动态
 人才就业
 CNTester基金
 标准规范
专注性能
 性能测试知识
 性能测试工具
 程序设计性能
 数据库性能
 Web应用服务器性能
 操作系统性能
 服务器与网络性能
测试技术
 用例设计
 性能测试
 自动化测试
 Web测试
 面向对象测试
 综合技术
 阶段性测试
 行业类测试
测试管理
 项目管理
 项目案例
 质量管理
 软件过程
测试工具
 Mercury系列
 Rational系列
 测试管理工具
 性能测试工具
 功能测试工具
 单元测试工具
 其它测试工具
开发社区
 Java技术
 DotNet技术
 C技术
 数据库技术
 操作系统
 服务器与中间件
工具下载
 测试工具
 开发工具
 企业工程
 网络通信
 媒体桌面
 游戏娱乐
 其他工具
资料下载
 测试资料
 程序设计
 数据库
 操作系统
 应用服务器
 电子期刊
 其他资料
 
 
您现在的位置: 中国测试员网站 >> 开发社区 >> C技术 >> 文章正文
  [推荐]C++面向对象编程入门:构造函数与析构函数           ★★★ 【字体:
C++面向对象编程入门:构造函数与析构函数
作者:管宁    文章来源:PConline    点击数:    更新时间:2007-7-5    
请注意,这一节内容是c++的重点,要特别注意!

  我们先说一下什么是构造函数。

  上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化成员变量呢,这一点对操作保护成员是至关重要的,答案是肯定的。关于c++类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c++对构造函数的一个基本定义。
1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。

  2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。

  3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。

  4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。

  我们来看下面的代码:

#include <iostream
using namespace std;   
class Student 

    public
    Student()//无参数构造函数 
    { 
        number = 1; 
        score = 100; 
    } 
    void show(); 
 
    protected
    int number; 
    int score; 
 
}; 
 
void Student::show() 

    cout<<number<<endl<<score<<endl; 

 
void main() 

    Student a; 
    a.show(); 
    cin.get(); 
}

  在类中的定义的和类名相同,并且没有任何返回类型的Student()就是构造函数,这是一个无参数的构造函数,他在对象创建的时候自动调用,如果去掉Student()函数体内的代码那么它和c++的默认提供的构造函数等价的。

  构造函数可以带任意多个的形式参数,这一点和普通函数的特性是一样的!

下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。

  代码如下:

#include <iostream
using namespace std;   
class Teacher 

    public
    Teacher(char *input_name)//有参数的构造函数 
    { 
        name=new char[10]; 
        //name=input_name;//这样赋值是错误的 
        strcpy(name,input_name); 
    } 
    void show(); 
 
    protected
    char *name; 
 
}; 
 
void Teacher::show() 

    cout<<name<<endl; 

 
void main() 

         //Teacher a;//这里是错误的,因为没有无参数的构造函数 
    Teacher a("test"); 
    a.show(); 
    cin.get(); 
}

  我们创建了一个带有字符指针的带有形参的Teacher(char *input_name)的构造函数,调用它创建对象的使用类名加对象名称加扩号和扩号内参数的方式调用,这和调用函数有点类似,但意义也有所不同,因为构造函数是为创建对象而设立的,这里的意义不单纯是调用函数,而是创建一个类对象。

  一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码

Teacher a;

  就是错误的!!!

  这里还有一处也要注意

//name=input_name;//这样赋值是错误的

  因为name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete释放堆空间出错!(析构函数的内容我们后面将要介绍)

  如果需要调用能够执行就需要再添加一个没有参数的构造函数

  对上面的代码改造如下:

#include <iostream
using namespace std;   
class Teacher 

    public
    Teacher(char *input_name) 
    { 
        name=new char[10]; 
        //name=input_name;//这样赋值是错误的 
        strcpy(name,input_name); 
    } 
    Teacher()//无参数构造函数,进行函数重载 
    { 
     
    } 
    void show(); 
 
    protected
    char *name; 
 
}; 
 
void Teacher::show() 

    cout<<name<<endl; 

 
void main() 

    Teacher test; 
    Teacher a("test"); 
    a.show(); 
    cin.get(); 
}

  创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类添加任意多个构造函数,来使用不同的参数来进行初始话对象。

现在我们来说一下,一个类对象是另外一类的数据成员的情况,如果有点觉得饶人那么可以简单理解成:类成员的定义可以相互嵌套定义,一个类的成员可以用另一个类进行定义声明。

  c++规定如果一个类对象是另外一类的数据成员,那么在创建对象的时候系统将自动调用那个类的构造函数。

  下面我们看一个例子。

  代码如下:

#include <iostream
using namespace std;   
class Teacher 

    public
    Teacher() 
    { 
        director = new char[10]; 
        strcpy(director,"王大力"); 
    } 
    char *show(); 
    protected
    char *director; 
}; 
char *Teacher::show() 

    return director; 

class Student 

    public
    Student() 
    { 
        number = 1; 
        score = 100; 
    } 
    void show(); 
 
    protected
    int number; 
    int score; 
    Teacher teacher;//这个类的成员teacher是用Teacher类进行创建并初始化的 
 
}; 
 
void Student::show() 

    cout<<teacher.show()<<endl<<number<<endl<<score<<endl; 

 
void main() 

    Student a; 
    a.show(); 
    Student b[5]; 
    for(int i=0; i<sizeof(b)/sizeof(Student); i++) 
    { 
        b[i].show(); 
    } 
    cin.get(); 
}

  上面代码中的Student类成员中teacher成员是的定义是用类Teacher进行定义创建的,那么系统碰到创建代码的时候就会自动调用Teacher类中的Teacher()构造函数对对象进行初始化工作!

  这个例子说明类的分工很明确,只有碰到自己的对象的创建的时候才自己调用自己的构造函数。

  一个类可能需要在构造函数内动态分配资源,那么这些动态开辟的资源就需要在对象不复存在之前被销毁掉,那么c++类的析构函数就提供了这个方便。

  析构函数的定义:析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。

  析构函数与构造函数最主要大不同就是在于调用期不同,构造函数可以有参数可以重载!

  我们前面例子中的Teacher类中就使用new操作符进行了动态堆内存的开辟,由于上面的代码缺少析构函数,所以在程序结束后,动态开辟的内存空间并没有随着程序的结束而小时,如果没有析构函数在程序结束的

[1] [2] [3] [4] 下一页

文章录入:fy818    责任编辑:fy818 
  • 上一个文章:

  • 下一个文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
    最新热点 最新推荐 相关文章
    · 面向对象设计与编程核心技术
    · Tomcat系统安全管理与权限管理
    · 雅虎公司C#笔试题
    · 利用Java事件处理机制实现录制、回放功能
    · apache+tomcat+mysql负载均衡和集群
    · Linux 指令大全
    · 应用服务器内存泄露问题诊断一例
    · 追求代码质量: 软件架构的代码质量
    · 对话 UNIX
    · 关于一些算法问题与朋友的讨论
    · 对话 UNIX
    · nmon 性能:分析 AIX 和 Linux 性能的免费
    · 追求代码质量: 谨防紧密耦合!
    · 应用服务器内存泄露问题诊断一例
    · Linux 指令大全
    · C 编程最佳实践
    · LPI 证书 101 考试准备,第2部分 [正则表
    · LPI 证书 101 考试准备,第1 部分 [使用L
    · Linux 究竟是什么?
    · 利用Java事件处理机制实现录制、回放功能
    深度探索C++对象模型
    C语言高效编程的四大绝招
    C++内存对象大会战
    C入门
    高质量C++/C编程指南
    初学者学习C++的50条忠告
     
     
     
    ======> [CNTester联盟群]交流群:34446273/21968356/64461572 白盒群:18400216 自动化群:2706508 性能群:4498858 外包群:59649884 管理群(需有管理经验):64442523
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | 

    Copyright@2007 by CNTester.com 中国测试员网站 桂ICP备07005590

    本站为开源免费网站,非商业赢利性组织。本站文章部分从网络搜索获取,如果您认为某些侵犯了您的权益,麻烦您联系本站,我们会尽快删除相关内容,同时也希望您的谅解,我们的初衷是为了让更多人去学习这方面的知识,让行业有更好的发展。

    联系电话: 15021358905