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: