• C++入门记-构造函数和析构函数


    前文回顾

    本文档环境基于Vscode + GCC + CodeRunner
    关于C++的环境搭建请参考下面链接:
    C++入门记-大纲

    由于本人具有C#开发经验,部分相同的知识就不再赘述了。只列一下需要记录的知识。

    HelloWorld

    cout 代表输出<<
    cin 代表输入 >>
    endl;代表换行,清空缓冲区。

    #include <iostream>
    int main()
    {
      std::cout << "Helloworld22222222222!" << std::endl;
      return 0;
    }
    

    RunCode结果如下:

    PS E:LearchCTestOne> cd "e:LearchCTestOne" ; if ($?) { g++ -fexec-charset=GBK -std=c++11 1-HelloWord.cpp -o a.exe } ; if ($?) { ./a.exe }
    Helloworld22222222222!
    

    使用命名空间

    
    #include <iostream>
    using namespace std;
    int main()
    {
      cout << "请输入一个数字!" << endl;
      int a;
      cin >> a;
      cout << "你输入的是" << a << endl;
      return 0;
    }
    
    

    RunCode结果如下:

    请输入一个数字!
    2
    你输入的是2
    

    构造函数和析构函数

    构造函数的作用:用于新建对象的初始化工作。
    析构函数的作用:用于在撤销对象前,完成一些清理工作,比如:释放内存等。
    每当创建对象时,需要添加初始化代码时,则需要定义自己的构造函数;而对象撤销时,需要自己添加清理工作的代码时,则需要定义自己的析构函数。

    按参数类型

    无参构造函数
    有参构造函数
    copy构造函数

    #include <iostream>
    using namespace std;
    class Person
    {
    public:
      int _a;
    
    public:
      //无参构造函数
      Person()
      {
        cout << "Person 构造函数的调用" << endl;
      }
      //有参构造函数
      Person(int a)
      {
        _a = a;
        cout << "Person构造函数A:" << a << endl;
      }
      Person(const Person &p)
      {
        _a = p._a;
        cout << "PersonCopay构造函数_a:" << _a << endl;
      }
      //析构函数
      ~Person()
      {
        cout << "Person 析构函数的调用" << endl;
      }
    };
    void test(){
     Person p1;
    }
    int main(){
     test();
    system("pause");
    return 0;
    }
    

    RunCode结果如下:

    test方法结束后,会调用析构函数。

    Person 构造函数的调用
    Person 析构函数的调用
    

    改变调用方式,在main里调用,将只出现调用构造函数,因为main函数后面pause暂停,不会释放Person的析构。

    int main(){
    Person p1;
    system("pause");
    return 0;
    }
    

    RunCode 结果如下

    Person 构造函数的调用
    

    按调用方式

    括号法
    显示调用
    隐式调用

    void test01()
    {
    
      //括号法
      // Person p1;     //默认
      // Person p2(2);  //有参
      // Person p3(p2); //copy构造函数
      // cout << "p2的age:" << p2._a << endl;
      // cout << "p3的age:" << p3._a << endl;
    
      //调用默认函数不能加()
      //因为下面这行代码编译器会认为是函数的声明,不会创建对象
      //Person p4();
    
      //显示法
      // Person p1;
      // Person p2 = Person(10);
      // Person p3 = Person(p2);
    
      // Person(10); //匿名对象,这行执行完毕,立即释放
      //注意事项2:不要用copy构造函数初始化匿名对象,编译器会认为Person (p3)==Person p3;
      //Person(p3);
      //cout << "P2-Age:" << p3._a << endl;
    
      //隐式转换法
      Person p1 = 10; //相当于写了Person p1=Person(10)
      Person p2 = p1; //相当于copy构造
    }
    

    注意事项:

    不要用copy构造函数初始化匿名对象;
    调用默认函数不能加();

    调用规则

    默认情况下,C++编译器至少给一个类添加三个函数
    1.默认构造函数(无参)
    2.默认析构函数
    3.默认拷贝构造函数,对属性进行值拷贝

    构造函数调用规则如下:
    如果用户定义有参构造函数,c++不在提供默认无参噶构造函数
    如果用户定义拷贝构造函数,c++不会再提供其他构造函数

    总结

    第三种隐式转换法,我看的有点头晕,写法太多。java和C#在构造函数这块调用方法做了简化,只能用new来创建对象。
    正所谓:华山自古一条道,好好的走吧!

  • 相关阅读:
    mysql8.0.21下载安装详细教程
    ORDER BY 高级用法之CASE WHEN继续研究
    前端实用在线小工具推荐
    从nodejs的AES加密解密之后文件大小不一致的问题谈谈AES加密中的补位
    纯前端如何实现多语言切换
    [React] React Virtual
    [Kotlin] Compare Functional Programming in Java and Kotlin
    [Kotlin] Catch Error in Java
    [Angular] Saving draft form into Cookies
    [Angular] Data Resolver
  • 原文地址:https://www.cnblogs.com/fancunwei/p/13587128.html
Copyright © 2020-2023  润新知