2021-02-099日目のチェックインとC ++の学習


1つ、クラスとオブジェクト

1.パッケージ

詳しくは学習内容8日目をご参照ください

2.オブジェクトの初期化とクリーンアップ

C ++のオブジェクト指向は生命から生まれたものであり、各オブジェクトには、オブジェクトが破棄される前にデータをクリーンアップするための初期設定と設定もあります。

(1)コンストラクタとデストラクタ

の目的語初期化掃除また、2つの非常に重要な安全上の問題です

  • オブジェクトまたは変数には初期状態がなく、その使用の結果は不明です
  • 同様に、オブジェクトまたは変数を使用した後、時間内にクリーンアップされないと、特定のセキュリティ問題が発生します

コンストラクター:これは主に、オブジェクトの作成時にオブジェクトのメンバープロパティに値を割り当てるために使用されます。コンストラクターは、手動で呼び出すことなく、コンパイラーによって自動的に呼び出されます。

デストラクタ:主な機能は、オブジェクトが破棄される前にシステムを自動的に呼び出して、クリーンアップ作業を実行することです。

構築と破棄の両方が必要です。自分で作成しない場合、コンパイラは自動的に追加しますが、システムは空の実装を提供します

コンストラクター構文类名 () { }

  1. コンストラクター、戻り値も書き込みvoidもありません
  2. 関数名はクラス名と同じです
  3. コンストラクターはパラメーターを持つことができるため、オーバーロードが発生する可能性があります
  4. プログラムは、オブジェクトを呼び出すときに構造体を自動的に呼び出します。手動で呼び出す必要はなく、1回だけ呼び出されます。

デストラクタ構文~类名() { }

  1. デストラクタ、戻り値も書き込みvoidもありません
  2. 関数名はクラス名と同じですが、名前の前に記号〜が付いています
  3. デストラクタはパラメータを持つことができないため、オーバーロードは発生しません
  4. プログラムはオブジェクトが破壊される前デストラクタは自動的に呼び出され、手動で呼び出す必要はなく、1回だけ呼び出されます。

比較例

#include<iostream>
using namespace std;

//创建类
class person
{
    
    
public:
	//1、构造函数
	person()
	{
    
    
		cout << "person构造函数的调用" << endl;
	}
	//2、析构函数
	~person()
	{
    
    
		cout << "person析构函数的调用" << endl;
	}
};

void test01()
{
    
    
	person p;
}
int main()
{
    
    
	test01();

	system("pause");
	return 0;
}

ここに画像の説明を挿入

#include<iostream>
using namespace std;

//创建类
class person
{
    
    
public:
	//1、构造函数
	person()
	{
    
    
		cout << "person构造函数的调用" << endl;
	}
	//2、析构函数
	~person()
	{
    
    
		cout << "person析构函数的调用" << endl;
	}
};

void test01()
{
    
    
	person p;
}
int main()
{
    
    
	//test01();
	person p;
	system("pause");
	return 0;
}

ここに画像の説明を挿入

(2)コンストラクターの分類と呼び出し

2つの分類方法:

  1. パラメータによる分類:パラメータ化された構造とパラメータ化されていない構造
  2. タイプ別分類:通常構造とコピー構造

3つの呼び出しメソッド:

  1. ブラケット
  2. 表示方法
  3. 暗黙の変換

予防
== 1.デフォルトのコンストラクターを呼び出すときは、()を追加しないでください。コンパイラーは、これが関数宣言であると見なします
== == 2。匿名オブジェクトを初期化するためにコピーコンストラクターを使用しないでください==

サンプルコード

#include<iostream>
using namespace std;

//创建类
class person
{
    
    
public:
	//1、构造函数
	person()
	{
    
    
		cout << "person无参构造函数的调用" << endl;
	}

	person(int a)
	{
    
    
		age = a;
		cout << "person有参构造函数的调用" << endl;
	}

	//拷贝构造函数
	person(const person &p)  //拷贝构造函数写法
	{
    
    
		//将传入的人身上的所有属性,拷贝到此函数内人的身上
		age = p.age;
		cout << "person拷贝构造函数的调用" << endl;
	}
	//2、析构函数
	~person()
	{
    
    
		cout << "person析构函数的调用" << endl;
	}

	int age;
};

//调用
void test01()
{
    
    
	//1、括号法
	cout << "1、括号法" << endl;
	person p1;//默认构造函数的调用
	person p2(10);//有参构造函数
	person p3(p2);//拷贝函数
	cout << "\n";

	//2、显示法
	cout << "2、显示法" << endl;
	person p4;
	person p5 = person(10);
	person p6 = person(p2);

	cout << "\n";
	cout << "匿名对象,执行结束后立即释放" << endl;
	person(10);//匿名对象  当前行执行结束后,系统会立即回收掉匿名对象
	cout << "123456" << endl;
	cout << "\n";

	//3、隐式转换法
	cout << "3、隐式转换法" << endl;
	person p7 = 10;//相当于写了person p6=person(10);//有参构造
	person p8 = p4;//拷贝构造
}
int main()
{
    
    
	test01();

	system("pause");
	return 0;
}

ここに画像の説明を挿入

(3)コピーコンストラクタを呼び出すタイミング

  • 作成済みのオブジェクトを使用して、新しいオブジェクトを初期化します
  • 値を関数パラメーターに値で渡す
  • ローカルオブジェクトを値で返す

(4)コンストラクター呼び出しルール

デフォルトでは、C ++コンパイラは少なくとも3つの関数をクラスに追加します

  1. デフォルトのコンストラクター(パラメーターなし、関数本体は空です)
  2. デフォルトのデストラクタ(パラメータなし、関数本体は空です)
  3. デフォルトのコピーコンストラクター、属性の値をコピーします

コンストラクター呼び出しルール:

  • ユーザーがパラメーターコンストラクターを定義すると、C ++はデフォルトのパラメーターなし構文を提供しなくなりますが、デフォルトのコピー構文を提供します
  • ユーザーがコピーコンストラクターを定義した場合、C ++は他のコンストラクターを提供しません

[注]学習コースは-ダークホースプログラムC ++チュートリアル

おすすめ

転載: blog.csdn.net/qq_42616280/article/details/113369032