検索
ホームページバックエンド開発C#.Net チュートリアルC++ レビューの要点 3 のまとめ - コンストラクター

コンストラクター: 戻り値の型宣言のない、クラスと同じ名前の関数がコンストラクターです。

コンストラクターの分類: パラメーターなしコンストラクター、パラメーター化されたコンストラクター、代入 (コピー) コンストラクター

Test() //无参构造函数定义
Test(inta, int b) //有参构造函数定义
Test(const Test &obj) //拷贝构造函数定义

3 種類のコンストラクターについては以下で説明します

1. パラメーターなしコンストラクター

メソッドの呼び出し: Test t1 , t2;わかりやすい

2 パラメトリックコンストラクター

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

class Test5
{ public: 
Test5(inta); 
Test5(int a, int b);
}
void main()
{ Test5 t1(10); //c++编译器默认调用有参构造函数 括号法
Test5 t2 = (20, 10); //c++编译器默认调用有参构造函数 等号法
Test5 t3 = Test5(30); //程序员手工调用构造函数 产生了一个对象 直接调用构造构造函数法
}

3. コピーコンストラクター

なぜコピーコンストラクターがあるのか​​ - クラスオブジェクトのコピー問題を解決するためです

通常のタイプのオブジェクトの場合、それらの間でコピーします例:

int a=88;
int b=a;

しかし、クラスオブジェクトの内部構造は通常より複雑で、さまざまなメンバー変数があります。クラスオブジェクトのコピーの簡単な例を見てみましょう。

#include <iostream>
using namespace std;
class CExample {
private:
 int a;
public:
 CExample(int b)
 { a=b;}
 void Show ()
 {
cout<<a<<endl;
}
};
int main()
{
 CExample A(100);
 CExample B=A;
 B.Show ();
 return 0;
}

プログラムを実行すると、画面に 100 が出力されます。上記のコードの実行結果から、システムがオブジェクト B にメモリを割り当て、オブジェクト A のコピー プロセスを完了したことがわかります。クラス オブジェクトに関する限り、同じ型のクラス オブジェクトのコピー プロセス全体がコピー コンストラクターを通じて完了します。次の例は、コピー コンストラクターの作業プロセスを示しています。

#include <iostream>
using namespace std;
class CExample {
private:
int a;
public:
CExample(int b)
{ a=b;}
CExample(const CExample& C)
{
a=C.a;
}
void Show ()
{
cout<<a<<endl;
}
};
int main()
{
CExample A(100);
CExample B=A;
B.Show ();
return 0;
} 
CExample(const CExample&
C)

はカスタム コピー コンストラクターです。コピー コンストラクターは特殊なコンストラクターであることがわかります。関数の名前はクラス名と一致している必要があります。このパラメーターは const 型であり、不変です。たとえば、クラス X のコピー コンストラクターの形式は X(X& x) です。

初期化されたカスタム クラス タイプ オブジェクトを使用して、新しく構築された別のオブジェクトを初期化すると、コピー コンストラクターが自動的に呼び出されます。つまり、クラスのオブジェクトをコピーする必要がある場合、コピー コンストラクターが呼び出されます。コピー コンストラクターは次の状況で呼び出されます:

オブジェクトが値によって関数本体に渡される

オブジェクトが値によって関数から返される

オブジェクトは別のオブジェクトによって初期化される必要がある。

クラス内でコピー コンストラクターを明示的に宣言しない場合、コンパイラーはデフォルトのコピー コンストラクターを自動的に生成し、オブジェクト間のビット コピーを完了します。ビットコピーはシャローコピーとも呼ばれますが、これについては後述します。

カスタム コピー コンストラクターは優れたプログラミング スタイルであり、コンパイラーがデフォルトのコピー コンストラクターを形成するのを防ぎ、ソース コードの効率を向上させることができます。

浅いコピーと深いコピー

場合によっては、クラス内のメンバー変数はヒープ メモリを動的に割り当てる必要があります。ビット コピーが実行されると、オブジェクト内の値が別のオブジェクトに完全にコピーされます (A=B など)。このとき、B のメンバ変数ポインタがメモリを割り当てている場合、A のメンバ変数も同じメモリを指します。これにより問題が発生します。B がメモリを解放すると (破壊など)、A のポインタがワイルド ポインタになり、実行時エラーが発生します。

ディープコピーとシャローコピーは、単純に理解すると、クラスがリソースを持っている場合、このクラスのオブジェクトがコピーされると、リソースが再割り当てされ、逆に、リソースが存在しない場合、このプロセスはディープコピーになります。再割り当てされた場合、それは浅いコピーになります。以下はディープコピーの例です。

#include <iostream>
using namespace std;
class CA
{
 public:
  CA(int b,char* cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA& C)
  {
   a=C.a;
   str=new char[a]; //深拷贝
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<<str<<endl;
  }
  ~CA()
  {
   delete str;
  }
 private:
  int a;
  char *str;
};
int main()
{
 CA A(10,"Hello!");
 CA B=A;
 B.Show();
 return 0;
}

ディープ コピーとシャロー コピーの定義は、次のように単純に理解できます: クラスがリソース (ヒープ、またはその他のシステム リソース) を所有している場合、このクラスのオブジェクトがコピーされるとき、このプロセスは ディープ コピー と呼ばれます。一方、オブジェクトにリソースがあるにもかかわらず、そのリソースがコピー プロセス中にコピーされない場合、それは浅いコピーとみなされます。

リソースを浅くコピーした後、リソースが解放されると、リソースの所有権が不明瞭になり、プログラムの実行エラーが発生します。

Test (Test &c_t) はカスタム コピー コンストラクターの名前はクラス名と一致している必要があり、関数の仮パラメーターはこの型の参照変数である必要があります。

すでに初期化されたカスタム クラス タイプ オブジェクトを使用して、新しく構築された別のオブジェクトを初期化する場合、カスタム コピー コンストラクターがない場合は、コピー コンストラクターが自動的に呼び出され、これを完了するためにデフォルトのコピー コンストラクターが提供されます。上記のコードのコアとなるコピー ステートメントは、Test (Test &c_t) コピー コンストラクターの p1=c_t.p1; プロセスによって完了します。

上記は C++ レビューの重要なポイントの 3 番目の要約です - コンストラクターの内容 詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
汎用性のある.NET言語としてのC#:アプリケーションと例汎用性のある.NET言語としてのC#:アプリケーションと例Apr 26, 2025 am 12:26 AM

C#は、エンタープライズレベルのアプリケーション、ゲーム開発、モバイルアプリケーション、Web開発で広く使用されています。 1)エンタープライズレベルのアプリケーションでは、C#がasp.netcoreにWebAPIを開発するためによく使用されます。 2)ゲーム開発では、C#がUnityエンジンと組み合わされて、ロールコントロールやその他の機能を実現します。 3)C#は、コードの柔軟性とアプリケーションのパフォーマンスを改善するために、多型と非同期プログラミングをサポートします。

Web、デスクトップ、モバイル開発用のC#.NETWeb、デスクトップ、モバイル開発用のC#.NETApr 25, 2025 am 12:01 AM

C#と.NETは、Web、デスクトップ、モバイル開発に適しています。 1)Web開発では、ASP.Netcoreがクロスプラットフォーム開発をサポートしています。 2)デスクトップ開発では、さまざまなニーズに適したWPFとWINFORMSを使用します。 3)モバイル開発は、Xamarinを介したクロスプラットフォームアプリケーションを実現します。

C#.NETエコシステム:フレームワーク、ライブラリ、およびツールC#.NETエコシステム:フレームワーク、ライブラリ、およびツールApr 24, 2025 am 12:02 AM

C#.NETエコシステムは、開発者がアプリケーションを効率的に構築できるようにするための豊富なフレームワークとライブラリを提供します。 1.ASP.NETCOREは、高性能Webアプリケーションの構築に使用されます。2.EntityFrameWorkCoreは、データベース操作に使用されます。これらのツールの使用とベストプラクティスを理解することにより、開発者はアプリケーションの品質とパフォーマンスを向上させることができます。

azure/awsへのc#.netアプリケーションの展開:ステップバイステップガイドazure/awsへのc#.netアプリケーションの展開:ステップバイステップガイドApr 23, 2025 am 12:06 AM

c#.netアプリをAzureまたはAWSに展開する方法は?答えは、AzureAppServiceとAwselasticBeanStalkを使用することです。 1。Azureでは、AzureAppServiceとAzurePipelinesを使用して展開を自動化します。 2。AWSでは、Amazon ElasticBeanstalkとAwslambdaを使用して、展開とサーバーレス計算を実装します。

C#.NET:強力なプログラミング言語の紹介C#.NET:強力なプログラミング言語の紹介Apr 22, 2025 am 12:04 AM

C#と.NETの組み合わせにより、開発者に強力なプログラミング環境を提供します。 1)C#は、多型と非同期プログラミングをサポートします。2).NETは、クロスプラットフォーム機能と同時処理メカニズムを提供し、デスクトップ、Web、モバイルアプリケーション開発で広く使用されています。

.NETフレームワーク対C#:用語のデコード.NETフレームワーク対C#:用語のデコードApr 21, 2025 am 12:05 AM

.NetFrameworkはソフトウェアフレームワークであり、C#はプログラミング言語です。 1..netframeworkは、デスクトップ、Web、モバイルアプリケーションの開発をサポートするライブラリとサービスを提供します。 2.C#は.NetFrameWork用に設計されており、最新のプログラミング機能をサポートしています。 3..NetFrameworkはCLRを介してコード実行を管理し、C#コードはILにコンパイルされ、CLRによって実行されます。 4. .NetFrameWorkを使用してアプリケーションをすばやく開発し、C#はLINQなどの高度な関数を提供します。 5.一般的なエラーには、タイプ変換と非同期プログラミングデッドロックが含まれます。 VisualStudioツールは、デバッグに必要です。

C#.NETの分解:初心者の概要C#.NETの分解:初心者の概要Apr 20, 2025 am 12:11 AM

C#は、Microsoftが開発した最新のオブジェクト指向プログラミング言語であり、.NETはMicrosoftが提供する開発フレームワークです。 C#は、CのパフォーマンスとJavaのシンプルさを組み合わせており、さまざまなアプリケーションの構築に適しています。 .NETフレームワークは、複数の言語をサポートし、ガベージコレクションメカニズムを提供し、メモリ管理を簡素化します。

C#と.NETランタイム:それらがどのように連携するかC#と.NETランタイム:それらがどのように連携するかApr 19, 2025 am 12:04 AM

C#と.NETランタイムは密接に連携して、開発者に効率的で強力なプラットフォームの開発機能に力を与えます。 1)C#は、.NETフレームワークとシームレスに統合するように設計されたタイプセーフおよびオブジェクト指向のプログラミング言語です。 2).NETランタイムは、C#コードの実行を管理し、ガベージコレクション、タイプの安全性、その他のサービスを提供し、効率的でクロスプラットフォームの操作を保証します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター