主頁 > 後端開發 > c++-多載等號,陣列,指標,字串類

c++-多載等號,陣列,指標,字串類

2020-09-19 05:53:02 後端開發

多載

  • 多載=運算子
    • 1先釋放舊物件資源
    • 2用一個物件=給另外一個物件
    • 3函式回傳值當左值 回傳一個參考
    • 4 陣列類 Array& operator=(Array& a1);
    • 5 字串類:MyString& operator=(const MyString& obj);
    • char& operator[](int index) const;
  • 運算子多載難點
    • 多載=運算子
      • 1先釋放舊物件資源
      • 2用一個物件=給另外一個物件
      • 3函式回傳值當左值 回傳一個參考
      • 4 陣列類 Array& operator=(Array& a1);
      • 5 字串類:MyString& operator=(const MyString& obj);
    • char& operator[](int index) const;
    • 多載[]陣列下標
      • 1 回傳元素的參考,支持a[i]當左值 a[i]右值
      • 2 陣列類 int& operator[](int i);
      • 3 字串類 char& operator[](int index) const;
    • && 和 || 不能被多載
    • ()多載
  • 案例:陣列類 運算子多載優化
  • 案例:字串類 運算子多載

等號運算子多載

  • 多載=運算子
    • 1 先釋放舊物件資源
    • 2 用一個物件=給另外一個物件
    • 3 函式回傳值當左值 回傳一個參考
    • 4 陣列類 Array& operator=(Array& a1);
    • 5 字串類:MyString& operator=(const MyString& obj);
    • char& operator[](int index) const;
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>


using namespace std;

class Student
{
public:
	Student()
	{
		this->id = 0;
		this->name = NULL;
	}

	Student(int id, char *name)
	{
		this->id = id;

		//this->name = name;
		int len = strlen(name);
		this->name = new char[len + 1];
		strcpy(this->name, name);
	}

	Student(const Student &another)
	{
		this->id = another.id;

		//深拷貝
		int len = strlen(another.name);
		this->name = new char[len + 1];
		strcpy(this->name, another.name);
	}

	Student & operator=(const Student &another)
	{
		//1 防止自身賦值
		if (this == &another) {
			return *this;
		}

		//2 先將自身的額外開辟的空間回收掉
		if (this->name != NULL) {
			delete[] this->name;
			this->name = NULL;
			this->id = 0;
		}

		//3 執行深拷貝
		this->id = another.id;

		int len = strlen(another.name);
		this->name = new char[len + 1];
		strcpy(this->name, another.name);


		//4 回傳本身
		return *this;
	}

	void printS()
	{
		cout << name << endl;
	}

	~Student() {
		if (this->name != NULL) {
			delete[] this->name;
			this->name = NULL;
			this->id = 0;
		}
	}
private:
	int id;
	char *name;
};

int main(void)
{

	Student s1(1, "zhang3");
	Student s2(s1);

	s2 = s1;

	Student s3(2, "li4");


	//s2 = s3 = s1;//s2 = 賦值運算子



	s1.printS();
	s2.printS();
	s3.printS();


	return 0;
}

自定義陣列類運用多載

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "MyArray.h"

using namespace std;



int main(void)
{

 MyArray array1(10);//開辟10元素的陣列

	//賦值操作
	for (int i = 0; i < 10; i++) {
		//array1.setData(i, i + 10);
		array1[i] = i + 10;//space[1] = 1+10
	}

	cout << "--------" << endl;

	cout << "array1:" << endl;
	for (int i = 0; i < 10; i++) {
		cout << array1[i] << " ";
	}
	cout << endl;

	MyArray array2 = array1;
	cout << "array2:" << endl;
	for (int i = 0; i < array2.getLen(); i++) {
		cout << array2[i] << " ";
	}
	cout << endl;
	

	cout << " ------------" << endl;
	MyArray array3(5);

	cin >> array3;


	cout << "array3:" << endl;
	cout << array3 << endl;
	cout << endl;

	
	if (array3 != array1)  {
		cout << "不相等" << endl;
	}
	else {
		cout << "相等 " << endl;
	}

	return 0;
}

Array.cpp

#include "MyArray.h"


MyArray::MyArray()
{
	cout << "MyArray()..." << endl;
	this->len = 0;
	this->space = NULL;
}

MyArray::MyArray(int len)
{
	if (len <= 0) {
		this->len = 0;
		return;
	}
	else {
		this->len = len;

		//給space開辟空間
		this->space = new int[this->len];
		cout << "MyArray::MyArray(int len) ..." << endl;
	}
}
MyArray::MyArray(const MyArray &another)
{
	if (another.len >= 0) {
		this->len = another.len;

		//深拷貝
		this->space = new int[this->len];
		for (int i = 0; i < this->len; i++) {
			this->space[i] = another.space[i];
		}
		cout << "MyArray::MyArray(const MyArray &another) ..." << endl;

	}
}
MyArray::~MyArray()
{
	if (this->space != NULL) {
		delete[]this->space;
		this->space = NULL;
		len = 0;
		cout << "MyArray::~MyArray() ..." << endl;
	}
}

void MyArray::setData(int index, int data)
{
	if (this->space != NULL) {
		this->space[index] = data;
	}
}
int MyArray::getData(int index)
{
	return this->space[index];
}
int MyArray::getLen() const
{
	return this->len;
}

MyArray&  MyArray::operator=(const MyArray& another)
{
	if (this == &another) {
		return *this;
	}

	if (this->space != NULL) {
		delete[]this->space;
		this->space = NULL; 
		this->len = 0;
	}

	if (another.len >= 0) {
		this->len = another.len;

		//深拷貝
		this->space = new int[this->len];
		for (int i = 0; i < this->len; i++) {
			this->space[i] = another.space[i];
		}
		cout << "MyArray::operator=(const MyArray& another) ..." << endl;

	}

	return *this;
}

int & MyArray::operator[](int index) const
{
	return this->space[index];
}


ostream &operator<<(ostream &os,const MyArray &array)
{
	os << "遍歷整個陣列 " << endl;
	//array.getLen(); //getLen(&array);
	for (int i = 0; i < array.getLen(); i++) {
		os << array[i] <<" ";//array.operator[]( i)
	}

	os << "呼叫的<<運算子多載" << endl;

	return os;
}

istream &operator>>(istream &is, MyArray &array)
{
	cout << "請輸入" << array.getLen() << "個數" << endl;
	for (int i = 0; i < array.getLen(); i++) {
		cin >> array[i];
	}
	return is;
}


bool operator==(MyArray &array1, MyArray &array2)
{
	if (array1.len != array2.len) {
		return false;
	}

	for (int i = 0; i < array1.len; i++) {
		if (array1.space[i] != array2.space[i]) {
			return false;
		}
	}

	return true;
}
bool MyArray::operator!=(MyArray &another)
{
	return !(*this == another);
}

Array.h

#pragma once
#include <iostream>

using namespace std;

class MyArray
{
public:
	MyArray();
	MyArray(int len);
	MyArray(const MyArray &another);
	~MyArray();

	void setData(int index, int data);
	int getData(int index);
	int getLen() const ;

	MyArray& operator=(const MyArray& another);

	int & operator[](int index) const;

	friend ostream &operator<<(ostream &os,const MyArray &array);
	friend istream &operator>>(istream &is, MyArray &array);

	friend bool operator==(MyArray &array1, MyArray &array2);
	bool operator!=(MyArray &another);
private:
	int len;
	int *space;
};

多載小括號

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;

class Sqr
{
public:
	Sqr(int a) {
		this->a = a;
	}

	int operator()(int value)
	{
		return value * value;
	}

	int operator()(int value1, int value2)
	{
		return value1 * value2;
	}


private:
	int a;
};

void func(int a)
{

}

int main(void)
{
	Sqr s(10);

	int value = https://www.cnblogs.com/ygjzs/p/s(2);
	//s.operator()(2);
	
	//將一個物件 當成一個普通函式來呼叫,
					//稱這種物件是 仿函式,偽函式, 函式物件
	 

	cout << value << endl;

	value = s(10, 20);
	
	cout << value << endl;


	return 0;
}

多載new和delete運算子

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>


using namespace std;

class A
{
public:
	A()
	{
		cout << "A()..." << endl;
	}
	A(int a) {
		cout << "A(int)..." << endl;
		this->a = a;
	}

	//多載的new運算子 依然會觸發物件的建構式
	void * operator new(size_t size)
	{
		cout << "多載了new運算子" << endl;
		return malloc(size);
	}

	void *operator new[](size_t size)
	{
		cout << "多載了new[]運算子" << endl;
		return malloc(size);
	}
	void operator delete(void * p)
	{
		cout << "多載了delete運算子" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

	void operator delete[](void *p)
	{
		cout << "多載了delete[]運算子" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

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

private:
	int a;
};

int main(void)
{
	//char *array = malloc(sizeof(char)* 80);

	//int *value_p = new int;

	A *array_p = new A[10];


	//array_p->operator new[](sizeof(A[10]));
	delete[] array_p;

	A *ap = new A(10);

	//ap->operator new(sizeof(A));

	delete ap;
	
	return 0;
}

多載&&和||(不建議多載)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;


class Test
{
public:
	Test(int value) {
		this->value = https://www.cnblogs.com/ygjzs/p/value;
	}

	Test operator+(Test &another)
	{
		cout << "執行了+運算子多載" << endl;
		Test temp(this->value + another.value);
		return temp;
	}

	bool operator&&(Test &another)
	{
		cout << "執行了&&運算子多載" << endl;
		if (this->value && another.value) {
			return true;
		}
		else {
			return false;
		}

	}

	bool operator||(Test &another)
	{
		cout << "多載了||運算子" << endl;
		if (this->value || another.value) {
			return true;
		}
		else {
			return false;
		}
	}

	~Test(){
		cout << "~Test()..." << endl;
	}
private:
	int value;
};

int main(void)
{
	int a = 1;
	int b = 20;


	Test t1(0);
	Test t2(20);

	//多載&&運算子,并不會發生短路現象,

	if (t1 && (t1+t2) ) {	//t1.operator&&(  t1.operator+(t2)  )
		cout << "為真" << endl;
	}
	else {
		cout << "為假" << endl;
	}

	cout << "------" << endl;

	if (t1 || (t1 + t2)) {//t1.operator||(  t1.operator+(t2) )
		cout << "為真" << endl;
	}
	else {
		cout << "為假" << endl;
	}


	return 0;
}

自定義智能指標

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory>


using namespace std;

class A
{
public:
	A(int a)
	{
		cout << "A()..." << endl;
		this->a = a;
	}

	void func() {
		cout << "a = " << this->a << endl;
	}

	~A() {
		cout << "~A()..." << endl;
	}
private:
	int a;
};


class MyAutoPtr
{
public:
	MyAutoPtr(A * ptr)
	{
		this->ptr = ptr;//ptr = new A(10)
	}

	~MyAutoPtr() {
		if (this->ptr != NULL) {
			cout << "delte ptr" << endl;
			delete ptr;
			this->ptr = NULL;
		}
	}

	A* operator->()
	{
		return this->ptr;
	}


	A& operator*()
	{
		return *ptr;
	}

private:
	A *ptr;
};

void test1()
{
#if 0
	A* ap = new A(10);

	ap->func();
	(*ap).func();

	delete ap;
	auto_ptr<int> ptr(new int);
#endif
	auto_ptr<A> ptr(new A(10));

	ptr->func();
	(*ptr).func();
}


void test2()
{
	MyAutoPtr my_p(new A(10));

	my_p->func(); //my_p.ptr -> func()
	(*my_p).func(); //  *ptr.func()
}
int main(void)
{
	
	//test1();
	test2();

	return 0;
}

自定義字串類

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include "MyString.h"

using namespace std;

int main(void)
{
	string s1;
	MyString s1("abc");
	MyString s2("123");

	//cout << s1 + s2 << endl;

	cout << s1 << endl;
	cout << s2 << endl;


#if 0
	MyString s1("abc");
	MyString s2(s1);
	MyString s3 = "123";


	cout << s1 << endl;
	cout << s2 << endl;

	s1[1] = 'x';

	cout << s1 << endl;

	s1 = s3;

	cout << s1 << endl;

#endif
	return 0;
}

String.cpp

#include "MyString.h"


MyString::MyString()
{
	this->len = 0;
	this->str =NULL;
}

MyString::MyString(const char *str)
{
	if (str == NULL) {
		this->len = 0;
		this->str = new char[0 + 1];
		strcpy(this->str, "");
	}
	else {
		int len = strlen(str);
		this->len = len;

		this->str = new char[len + 1];
		strcpy(this->str, str);
	}
}

//初始化時候被呼叫的
MyString::MyString(const MyString &another)
{
	this->len = another.len;
	this->str = new char[this->len + 1];
	strcpy(this->str, another.str);
}



MyString::~MyString()
{
	if (this->str != NULL) {
		cout << this->str << "執行了解構式" << endl;
		delete this->str;
		this->str = NULL; 
		this->len = 0;
	}
}

char & MyString::operator[](int index)
{
	return this->str[index];
}

MyString &  MyString::operator=(const MyString &another)
{
	if (this == &another) {
		return *this;
	}

	if (this->str != NULL) {
		delete[] this->str;
		this->str = NULL;
		this->len = 0;
	}

	this->len = another.len;
	this->str = new char[this->len + 1];
	strcpy(this->str, another.str);

	return *this;
}

ostream & operator<<(ostream &os, MyString&s)
{
	os << s.str;
	return os;
}

istream & operator>>(istream &is, MyString &s)
{
	//1 將s之前的字串釋放掉
	if (s.str != NULL) {
		delete[] s.str;
		s.str = NULL;
		s.len = 0;
	}

	//2 通過cin添加新的字串
	char temp_str[4096] = { 0 };
	cin >> temp_str;

	int len = strlen(temp_str);
	s.str = new char[len + 1];
	strcpy(s.str, temp_str);
	s.len = len;

	return is;
}

MyString MyString::operator+(MyString &another)
{
	MyString temp;

	int len = this->len + another.len;

	temp.len = len;

	temp.str = new char[len + 1];
	memset(temp.str, 0, len + 1);
	strcat(temp.str, this->str);
	strcat(temp.str, another.str);

	return temp;
}


String.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class MyString
{
public:
	MyString();
	//MyString(int len); //創建一個長度是len的string物件
	MyString(const char *str);
	MyString(const MyString &another);
	~MyString();

	//多載運算子[]
	char &operator[](int index);



	//多載運算子>>
	friend istream & operator>>(istream &is, MyString &s);

	//多載=運算子
	MyString & operator=(const MyString &another);

	//多載==運算子

	//多載!=運算子


	//多載+運算子
	MyString operator+(MyString &another);


	//多載運算子<<
	friend ostream & operator<<(ostream &os, MyString&s);

private:
	int len;
	char *str;
};


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/79223.html

標籤:C++

上一篇:c++-多載運算子(+-,++,--,+=,-=,cin,cout)

下一篇:c++-類與類的關系

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more