2023.5.10 (C++ メモ)

目次

内部クラス

内部クラスは外部クラスの自然な友達です。

匿名オブジェクト (使用時に破棄されます)

コンパイラによる構築の最適化

 C/C++ メモリ管理

new と delete (ペアで使用)

newとmallocの違い


内部クラス

内部クラスには、パブリック内部クラスとプライベート内部クラスの 2 種類があります。

ただしアクセス資格により制限される

内部クラスはクラス内で宣言するときにスペースを占有せず、定義のみがスペースを占有します。

カテゴリ B を見つけると、それは 12 になります。

内部クラスは外部クラスの自然な友達です。

内部クラスは外部クラスのデータにアクセスできますが、外部クラスは内部クラスの情報にアクセスできません。

匿名オブジェクト (使用時に破棄されます)

クラス名+(パラメータ)

匿名オブジェクトには永続性がある

const A& ra = A(2);//const 参照は匿名オブジェクトのライフ サイクルを拡張し、ライフ サイクルは現在の関数のローカル ドメイン内にあります。

//匿名对象
class A
{
public:
	//构造函数
	A(int a=1)
		:_a(a)
	{
		cout << "A(int a)" << endl;
	}

	~A()
	{
		cout << "~A()" << endl;
	}

private:
	int _a=1;
};

class Solution
{
public:
	Solution()
	{
		
	}

	~Solution()
	{
		cout << "~Solution()" << endl;
	}

	int Sum_Solution(int n)
	{
		cout << "Sum_Solution" << endl;

		return n;
	}
};

	int main()
	{
		A a(2);//有名对象--生命周期在当前函数局部域

		//匿名对象即用即销毁
		A(2);//匿名对象--生命周期在当前行
		A();//可以理解成后面就没人用了,就直接销毁了


		// A& ra = A(1);//匿名对象具有常性
		const A& ra = A(2);//const引用延长匿名对象的生命周期,生命周期在当前函数局部域,
		//可以理解为因为后面ra还会用这个匿名对象,所以没有销毁



		//创建对象,调用函数
		 Solution b;
	
		//有名对象不能这样写  Solution A();  因为编译器不知道这是对象,还是函数声明
		 b.Sum_Solution(10);
		

		//匿名对象调用函数,还是会先走构造函数,再进入调用的函数,必须加一个括号,
		//有默认构造函数不要传参,没有的话正常传参
		Solution().Sum_Solution(10);
		//Solution::Sum_Solution(10);错误调用,没有this指针可以传递


		return 0;
	}

constありとなしの型は異なります

関数のオーバーロードが発生する可能性がある

コンパイラによる構築の最適化

連続構築 + コピー構築が同じ行の 1 つの式で発生し、最適化が 1 つに結合されます。

最適化

そしてaa=1;

最適化されていない

Aaa1;

関数(aa1);

そんなときは一行で書くようにしましょう

 

 C/C++ メモリ管理

アドレスは上から下に向かって減少します。

言語の観点からは静的領域と呼ばれ、システムの観点からはデータセグメントと呼ばれます。

定数エリア/コードセグメント

スタック フレームの確立の本質は、ローカル データを保存し、再帰呼び出しを行うことです。

プログラムにはさまざまなニーズがあるため、メモリを割り当て、領域を分割する必要があります。

c c c a a 

a a d a b

strlen は '\0' のカットオフに遭遇しました。'\0' はカウントされません

32 ビット ポインター サイズは 4、64 ビット ポインター サイズは 8

※配列名を使用する場合、配列名は先頭要素のアドレスを表します。

sizeof(配列名)、配列名は配列全体を表します

const はデータ格納領域には影響を与えないため、const の追加は定数領域とはみなされません。

a と b のアドレスが非常に近いことがわかり、b もスタック上にあると判断できます。

 

拡張スペースが十分でない場合、realloc は元のスペースを自動的に破棄し、データを新しい場所に転送します。

 

new と delete (ペアで使用)

、無料と混合することはできません、不明な問題が発生する可能性があります

newとmallocの違い

malloc はスペースを開きます

 new オープンスペース + オブジェクトのコンストラクターの初期化を呼び出す

struct ListNode
{
	int _val;
	struct ListNode* _next;

	ListNode(int x)
		:_val(x)
		, _next(NULL)
	{}
};

struct ListNode* BuyListNode(int x)
{
	// 单纯开空间
	struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
	// 检查
	newnode->_next = NULL;
	newnode->_val = x;

	return newnode;
}

int main()
{
	struct ListNode* n1 = BuyListNode(1);
	struct ListNode* n2 = BuyListNode(2);
	struct ListNode* n3 = BuyListNode(3);

	// 开空间+用对象调用构造函数初始化
	ListNode* nn1 = new ListNode(1);
	ListNode* nn2 = new ListNode(2);
	ListNode* nn3 = new ListNode(3);

	return 0;
}

おすすめ

転載: blog.csdn.net/2202_75625589/article/details/130671369