PoEdu培训 C++班 类和对象阶段总结(一) 构造,析构,拷贝构造,赋值函数的配合变化
文章类别: 培训笔记 0 评论

PoEdu培训 C++班 类和对象阶段总结(一) 构造,析构,拷贝构造,赋值函数的配合变化

文章类别: 培训笔记 0 评论

类的4个函数总结联系

举个栗子

// 构造函数 析构函数 赋值函数 拷贝构造函数练习

#include <iostream>

namespace Hades
{
    using namespace std;

    class ClassExam
    {
    private:
        int _iNum = -1;

    public:
        ClassExam()
        {
            cout << "ClassExam 的无参(默认)构造函数. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
        }
        ClassExam(int iNum) : _iNum(iNum)
        {
            cout << "ClassExam 的int参数构造函数. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
        }

        explicit ClassExam(char cNum) : _iNum(static_cast<int>(cNum))
        {
            cout << "ClassExam 的char参数构造函数. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
        }

        ClassExam(const ClassExam& other)
        {
            cout << "ClassExam 的 (默认)拷贝构造函数. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
            if (this != &other)
                _iNum = other._iNum;
        }

        ClassExam& operator=(const ClassExam& other)
        {
            cout << "ClassExam 的 ClassExam&(默认)赋值函数 operator=. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
            if (this != &other)
                _iNum = other._iNum;
            return *this;
        }

        //ClassExam& operator=(const int iNum)
        //{
        //    cout << "ClassExam 的 int赋值函数 operator=. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
        //    _iNum = iNum;
        //    return *this;
        //}

        //ClassExam& operator=(const char cNum)
        //{
        //    cout << "ClassExam 的 char赋值函数 operator=. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
        //    _iNum = static_cast<int>(cNum);
        //    return *this;
        //}

        ClassExam& operator=(const char* szVal)
        {
            cout << "ClassExam 的 char*赋值函数 operator=. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
            _iNum = static_cast<int>(szVal[0]);
            return *this;
        }

        ~ClassExam()
        {
            cout << "ClassExam 的无参(默认)析构函数. 此时 _iNum 值为:[" << _iNum << "]" << endl << endl;
        }
    };
}

int main(int argc, char* argv[])
{
    using namespace std;
    using namespace Hades;

    // 写出下列函数的调用顺序
    ClassExam ex00;
    ClassExam ex01 = 10;
    ClassExam ex02(20);
    ClassExam ex03 = ex01;
    ClassExam ex04 = 40;
    ex04 = ex00;
    ex00 = 'H';
    ex01 = 66;
    ClassExam ex05 = 'L';
    ex02 = ex05;
    ex05 = ex01;

    return 0;
}

上诉结果看的不是特别清晰, 我重新整理一下.

<!--

写出下列函数的调用顺序
语句存在
<span style="color:red">无参构造函数,
int构造函数,
char构造函数,
析构函数,
默认拷贝构造函数,
默认赋值函数</span>
给<span style="color:red">char构造函数加上了<span style="color:blue">explicit</span>关键字</span>去掉<span style="color:red">int赋值函数</span><span style="color:red">新增增加char赋值函数</span>去掉<span style="color:red">char赋值函数,增加char*赋值函数</span>
<span style="color:blue">ClassExam ex00;</span>无参构造无参构造
<span style="color:blue">ClassExam ex01 = 10;</span>int构造(转换构造函数)int构造 (转换构造函数)
<span style="color:blue">ClassExam ex02(20);</span>int构造int构造
<span style="color:blue">ClassExam ex03 = ex01;</span>拷贝构造拷贝构造
<span style="color:blue">ClassExam ex04 = 40;</span>int构造(转换构造函数)int构造 (转换构造函数)
<span style="color:blue">ex04 = ex00;</span>默认赋值函数默认赋值函数
<span style="color:blue">ex00 = 'H';</span>int构造,int赋值函数,析构函数
<span style="color:red">写错了!!!!!
int赋值函数</span>
int赋值函数默认赋值
<span style="color:red">写错了!!!!!
int构造, 默认赋值, 析构</span>
char赋值char*赋值
<span style="color:red">写错了!!!
int构造, 默认赋值, 析构</span>
<span style="color:blue">ex01 = 66;</span>int赋值函数int赋值函数int构造, 默认赋值, 析构int构造, 默认赋值, 析构
<span style="color:blue">ClassExam ex05 = 'L';</span>char构造(转换构造函数)int构造 (转换构造函数)int构造 (转换构造函数)int构造 (转换构造函数)
<span style="color:blue">ex02 = ex05;</span>默认赋值函数默认赋值函数
<span style="color:blue">ex05 = ex01;</span>默认赋值函数默认赋值函数

-->

写出下列函数的调用顺序
语句           存在
<span style="color:red">无参构造函数,
int构造函数,
char构造函数,
析构函数,
默认拷贝构造函数,
默认赋值函数
int赋值函数</span>
给<span style="color:red"><br/>char构造函数加上了<br/><span style="color:blue">explicit</span>关键字</span> 去掉<span style="color:red"><br/>int赋值函数</span> 新增<span style="color:red"><br/>char赋值函数</span> 去掉<span style="color:red"><br/>char赋值函数,<br/>增加char*赋值函数</span>
<span style="color:blue">ClassExam ex00;</span> 无参构造 无参构造 无参构造 无参构造 无参构造
<span style="color:blue">ClassExam ex01 = 10;</span> int构造<br/>(转换构造函数) int构造<br/>(转换构造函数) int构造<br/>(转换构造函数) int构造<br/>(转换构造函数) int构造<br/>(转换构造函数)
<span style="color:blue">ClassExam ex02(20);</span> int构造 int构造 int构造 int构造 int构造
<span style="color:blue">ClassExam ex03 = ex01;</span> 拷贝构造 拷贝构造 拷贝构造 拷贝构造 拷贝构造
<span style="color:blue">ClassExam ex04 = 40;</span> int构造<br/>(转换构造函数) int构造<br/>(转换构造函数) int构造<br/>(转换构造函数) int构造<br/>(转换构造函数) int构造<br/>(转换构造函数)
<span style="color:blue">ex04 = ex00;</span> 默认赋值函数 默认赋值函数 默认赋值函数 默认赋值函数 默认赋值函数
<span style="color:blue">ex00 = 'H';</span> int赋值函数</span> int赋值函数 int构造, 默认赋值, 析构</span> char赋值 int构造, 默认赋值, 析构</span>
<span style="color:blue">ex01 = 66;</span> int赋值函数 int赋值函数 int构造, 默认赋值, 析构 char赋值 int构造, 默认赋值, 析构
<span style="color:blue">ClassExam ex05 = 'L';</span> char构造<br/>(转换构造函数) int构造 <br/>(转换构造函数) int构造 <br/>(转换构造函数) int构造 <br/>(转换构造函数) int构造 <br/>(转换构造函数)
<span style="color:blue">ex02 = ex05;</span> 默认赋值函数 默认赋值函数 默认赋值函数 默认赋值函数 默认赋值函数
<span style="color:blue">ex05 = ex01;</span> 默认赋值函数 默认赋值函数 默认赋值函数 默认赋值函数 默认赋值函数

个人总结

结论
在对象产生时, 必定会调用构造函数.
在类对象的 = 操作中, 都是进行函数的调用.

在对象销毁时, 必定会调用析构函数.

如有错误,请提出指正!谢谢.

回复