解析c++构造函数与析构函数

来源:互联网 发布:linux判断文件是否存在 编辑:程序博客网 时间:2024/04/29 11:58

目录

  • 目录
    • 构造函数的定义
    • 构造函数的特点
    • 构造函数
      • 默认构造函数
      • 转换构造函数
      • 拷贝构造函数
    • 析构函数的定义
    • 析构函数的特点
    • 析构函数

构造函数的定义

定义:构造函数是一种特殊的成员函数,对对象进行初始化的函数。

构造函数的特点

  • 构造函数名字必须与类名相同。
  • 构造函数不具有任何类型,没有返回值。
  • 在建立类的对象的时候,系统会自动调用构造函数。
  • 如果用户没有定义构造函数,系统会默认生成一个构造函数。

构造函数

由于构造函数的参数不同,构造函数可以进行重载,可以分为默认构造函数、转换构造函数、拷贝构造函数。

默认构造函数

定义:不带参数的构造函数。如果程序中不声明构造函数,那么系统会默认生成一个构造函数。

转换构造函数

定义:只有一个参数的构造函数,并将其它类型转换为类类型。
注意
1. String s1(“hello”);
2. s1 = “world”;
上面第二行是将“world”赋值给s1对象。先调用转换构造函数将“world”转换为类类型,生成一个临时对象。再调用’=’将临时对象赋值给s1对象。

拷贝构造函数

定义:只有一个参数并且参数为该类的引用的构造函数,用一个已有的对象类初始化新的同一个类的对象。
1、String.h

/*****************************************************Copyright (C): 2017-2018  File name    : String.hAuthor       : ZhengqijunDate         : 2017年02月11日 星期六 14时58分56秒Description  : 类的声明Funcion List : *****************************************************/#ifndef _STRING_H_#define _STRING_H_#include <iostream>using namespace std;class String{public:    String();                   //默认构造函数    String(char *str);          //转换构造函数    String(const String& other);//拷贝构造函数    ~String();                  //析构函数    /* 调用构造函数需要对'='进行重载 */    String& operator=(char *str);    String& operator=(const String& other);    void Display() const;       //成员函数private:    char *str_;                 //属性};#endif

2、String.cpp

/*****************************************************Copyright (C): 2017-2018  File name    : String.cppAuthor       : ZhengqijunDate         : 2017年02月11日 星期六 15时01分31秒Description  : 实现类的函数Funcion List : *****************************************************/#include <iostream>#include <string.h>#include "String.h"using namespace std;String::String(){    cout << "default constructor String!" << endl;    str_ = new char['\0'];}String::String(char *str){    cout << "constructor String!" << endl;    int len = strlen(str) + 1;    str_ = new char[len];    memset(str_, 0, len);    strcpy(str_, str);}String::String(const String& other){    int len = strlen(other.str_) + 1;    str_ = new char[len];    memset(str_, 0, len);    strcpy(str_, other.str_);}String& String::operator=(char *str){    int len = strlen(str) + 1;    str_ = new char[len];    memset(str_, 0, len);    strcpy(str_, str);    return *this;}String& String::operator=(const String& other){    if(this == &other)    //用this指针来与自身进行比较    {        return *this;    }    int len = strlen(other.str_) + 1;    delete [] str_;    str_ = new char[len];    memset(str_, 0, len);    strcpy(str_, other.str_);    return *this;}String::~String(){    cout << "destroy String!" << endl;}void String::Display() const{    cout << "str = " << str_ << endl;}

3、Main.cpp

/*****************************************************Copyright (C): 2017-2018  File name    : Main.cppAuthor       : ZhengqijunDate         : 2017年02月11日 星期六 15时10分27秒Description  : 主函数Funcion List : main()*****************************************************/#include <iostream>#include "String.h"using namespace std;int main(){    String s1("hello");    //调用转换构造函数对s1进行初始化    s1.Display();    String s2(s1);         //调用拷贝构造函数将对象s1赋值给对象s2    s2.Display();    return 0;}

运行后输出的结果是:

constructor String!str = hellostr = hellodestroy String!destroy String!

析构函数的定义

定义:析构函数也是一种特殊的成员函数,当对象的生命期结束时,对内存进行清理工作。

析构函数的特点

  • 当对象的生命期结束时,系统自动调用析构函数。
  • 析构函数名与类名相似,只是多了一个’~’。
  • 析构函数没有参数,没有返回值。
  • 如果没有定义析构函数,系统会默认生成一个析构函数。
  • 析构函数没有参数,所以不能被重载。

析构函数

注意:析构函数的调用顺序正好与构造函数的调用顺序相反。先构造的后析构,后构造的先析构。相当于栈 -> 先进后出。


0 0
原创粉丝点击