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:\LearchC\TestOne> cd "e:\LearchC\TestOne\" ; 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构造函数初始化匿名对象;
调用默认函数不能加();

总结

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

Tags: