目次
内部クラス
内部クラスには、パブリック内部クラスとプライベート内部クラスの 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;
}