C++ のクラスとオブジェクト (1)

クラスとは何ですか?

C 言語は C 言語と互換性があり、構造体はクラスにアップグレードされます
C 言語の構造はクラスですC++ では
a> 同時に、C++ のクラスはクラス
も意味します。では、違いは何でしょうか?
struct は、修飾子 が記述されていない場合に を意味します< a i= 10>すべてのパブリック、クラス内で外部から呼び出すことができます a>ことを意味します。< /span>外部から呼び出すことはできません がすべてプライベートであるは、修飾子を書き込まない場合

予選とは何ですか?

修飾子: アクセス権限はクラス内で設定されます
プライベート (プライベート) はクラス外から直接アクセスできません
パブリック (パブリック) クラス外使用可能
保護 (保護) クラス外からは直接アクセスできません

c++兼容c语言struct 的所有语法
struct 同时升级为了类
类名就是 类型 Stack就是类型 不需要加struct
类里面 可以定义函数
定义类可以用 struct 也可以用 class
不写限定符的时候 class 表示 私有 struct 表示公用
class Stack
{
    
    
	//类中的访问限定符 
	//private(私有) 不能在类外被直接访问
	//public(公用)类外可以使用 
	//protected(保护) 不能在类外被直接访问
	
private:
	int* a;
	int top;
	int capacity;

public:
	//默认定义在类里面的函数 是 内联函数 但不一定展开
	//正确用法,长的函数声明和定义分离
	//短小的函数可以在类里面直接定义x
	void Init();
	void Push(int x);
	bool Empty()
	{
    
    
		return top = 0;
	}
};

授業では何ができるのでしょうか?

関数はクラスで定義できます
定義されたこの関数はこのクラスでのみ使用できます< /a >関数がどのクラスに属するされている場合、関数が含まれるファイルどの宣言と定義が分離
同時に、 クラス内の関数

#include"Stack.h"

//如果声明和定义分离的话 要讲明属于那个类
void Stack::Init()
{
    
    
	a = nullptr;
	top = 0;
	capacity = 10;
}
void Stack::Push(int x)
{
    
    

}

struct Queue
{
    
    
	void Init()
	{
    
    

	}
};

struct ListNode
{
    
    
	ListNode* next;
	int val;
};

オブジェクトとは何ですか?

オブジェクト: クラスで定義された変数

クラスとオブジェクトの関係

クラスとオブジェクト間の関係が 1v 以上である

//类和对象的 关系是 1v多
// 设计图 和 房子
int main()
{
    
    
	Date d;//对象
	Date D;
	
}

クラス内の関数

クラス内の関数は、正式パラメータである this非表示にします。 < a i=4>スタック フレーム上に存在します 彼は渡されたオブジェクトを指すことができますが、< a i= 8>関数のパラメータには記述できません

class Date
{
    
    
public:
	void Init(int year, int month, int day)
	{
    
    
		// _在c++中惯例中 表示类部的 
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
    
    
		cout << this->_year <<endl << this->_month<<endl << this->_day << endl;
		cout << _year << _month << _day << endl;
	}
	//不能写出来 this
	//可以在类里面显示的使用
	/*void Print(Date* this)
	* //this 是形参 存在在栈帧上的
	{
		cout << this->_year << this->_month << this->_day << endl;
	}*/
	//声明不会开辟空间
private:
	int _year;
	int _month;
	int _day;
};

class B
{
    
    

};

类和对象的 关系是 1v多
 设计图 和 房子
int main()
{
    
    
	在类中 只计算变量 不计算函数
	类中函数放在公共区域 编译完之后是 一段指令
	无成员变量的类,对象大小开一个字节,这个字节不存储有效数据
	表示定义的对象存在过
	Date d;//对象
	Date D;
	cout << sizeof(d);
	cout << sizeof(B);
	d.Init(2023, 10, 7);
	D.Init(2022, 10, 7);
	
	d.Print();
	D.Print();
	不能显示的写 this 类似相关的形参和实参
	d.Print(&d1);
}

コンストラクターとは何ですか?

コンストラクター:
関数名はクラス名と同じです
コンストラクターはクラス内に存在します
クラスの初期化と同等
戻り値なし
オブジェクトのインスタンス化は自動的に呼び出すことができます
オーバーロードできます
各クラスが独自のコンストラクタを作成しない場合、デフォルトでコンストラクタが生成されます

ただし、クラス内にパラメータのない 2 つのコンストラクタを存在させることはできません

class Date
{
    
    
public:
	//勾成函数重载 但是无参调用的时候会有歧义
	/*Date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}	*/
	/*Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}*/
	void Init(int year, int month, int day)
	{
    
    
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
    
    
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	//C++11 开始支持
	//还是声明 ,只是声明时给了缺省值
	int _year = 1;
	int _month = 1;
	int _day = 1;
};

コンストラクターの概要

通常、メンバーがすべてカスタム タイプである場合、独自のコンストラクタを
作成する必要があります。デフォルト値 は宣言時に指定されており、 は自動的にコンパイルを 考慮する ことができます。コンストラクターによって生成される にコンストラクターがある場合、宣言されたデフォルト値は無効です。組み込み型は処理されません

デフォルト構築とは何ですか?

当社では、コンパイル中にデフォルトで生成されるコンストラクターは記述しません。これはデフォルト コンストラクターと呼ばれます
引数のないコンストラクタ、デフォルト構築
完全なデフォルト、デフォルト構築とも呼ばれます

パラメータを渡さずに呼び出されるコンストラクトは、デフォルトのコンストラクトと呼ばれます。

デストラクターとは何ですか?

デストラクター:
~クラス名
戻り値なし
自動的に呼び出されます
破棄と同様
記述されていない場合、コンパイラは自動的に生成します。
動的に開発されたクラスが必要です。
組み込み型は必要ありません。処理
カスタム タイプの処理
クラスはデストラクターを 1 つだけ持つことができます

class Date
{
    
    
public:
	//勾成函数重载 但是无参调用的时候会有歧义
	/*Date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}	*/
	/*Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}*/
	void Init(int year, int month, int day)
	{
    
    
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
    
    
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	//~
	~Date()
	{
    
    
		cout << "~Date()" << endl;
	}

コピー構築とは何ですか?

構造のコピー:
クラス名と同じ
戻り値なし
組み込み型のコピー< a i=4> 自動的に呼び出す カスタム タイプ オブジェクトにパラメータを渡すときは、コピー コンストラクターを呼び出す必要があります。


組み込みタイプは次の方法で直接コピーできます。 value
カスタム型メンバーがクラス内のコピー コンストラクターを呼び出す

クラスが動的に開かれる場合は、コピー コンストラクターを独自に記述する必要があります

浅いコピー:
組み込み型は、それ自体の内容を変更せずに値によって直接呼び出されます

void Test(Date d)
{
    
    
	//Date d1;
	d.Print();
}

ディープ コピー:
本質は、私と同じスペースと同じ値を持つように、指定されたリソースをコピーすることです

//深拷贝
//本质是拷贝指向的资源,让我跟你有一样的空间,一样的值
Stack(const Stack& d)
{
    
    
	_array = (int*)malloc(sizeof(int) * d._capacity);
	if (_array == NULL)
	{
    
    
		perror("malloc 失败");
		return;
	}
	memcpy(_array, d._array, sizeof(int) * d._size);
	_size = d._size;
	_capacity = d._capacity;
}

おすすめ

転載: blog.csdn.net/dabai__a/article/details/134320624