C++學習記錄1

MegaDataFlowers發表於2022-07-17

程式碼1:轉義字元

點選檢視程式碼
#include<iostream>
using namespace std;
void test01()//換行
{
	cout << "Hello World" << endl;
	//等價於cout << "Hello World\n" << endl;
}
void test02()//反斜槓
{
	cout<<"\\"<<endl;
	//打入兩個反斜槓才輸出一個反斜槓
}
void test03()//水平製表符\t
{
	//cout << "1111aaa\tHelloWorld" << endl;
	//\t佔8個空格 主要是為了整齊的輸出其後面的內容
	cout << "111aaa\thelloworld" << endl;
	cout << "111a\thelloworld" << endl;
	cout << "111aa\thelloworld" << endl;
	//
	cout << "111aaa helloworld" << endl;
	cout << "111a helloworld" << endl;
	cout << "111aa helloworld" << endl;
	//沒有\t並不會自動對齊
}
int main()
{
	test03();
	system("pause");
	return 0;
}

程式碼2:字串型別

點選檢視程式碼
//字串型
//C語言的形式:char 變數名字[] = "字串值";
//C++的形式:string 變數名字 = "字串值";

#include<iostream>
using namespace std;
//#include<string>
int main()
{
	char str[] = "Hello World";
	cout << str << endl;
	string arr = "Hello World";
	//包含標頭檔案
	cout << arr << endl;
	return 0;
}

程式碼3:布林型別

點選檢視程式碼

<details>
<summary>點選檢視程式碼</summary>

include

using namespace std;

int main()
{
bool flag = true;
cout << flag << endl;
//結果為1
flag = false;
cout << flag << endl;
//結果為0
cout << sizeof(bool) << endl;
//bool所佔記憶體空間:1個位元組大小
return 0;
}

</details>

//布林型別只要是非0的值都代表是真

程式碼4:取模運算
//兩個整數相除結果依然為整數
//兩個小數是可以相除的
//運算結果也可以為小數
//兩個數相除 除數不可以為0

點選檢視程式碼
#include<iostream>
using namespace std;

int main()
{
	 //取模
	cout << 10 % 20 << endl;//10
	cout << 10 % 3 << endl;//1
	cout << 10 % 0 << endl;//10不可以除以0
	//cout << 1.1 % 2.1 << endl;//兩個小數是不可以進行取模運算的

	return 0;
}

//只有整型變數才可以進行取模運算
程式碼5:隨機數

點選檢視程式碼
#include<iostream>
using namespace std;
//#include<ctime>
int main()
{
	//新增隨機數種子
	//利用當前系統的時間去生成隨機數 防止每一次隨機數都一樣
	srand((unsigned int)time(NULL));
	int num1 = rand() % 100;//產生0到99
	int num2 = rand() % 100 + 1;//產生1到100
	int num3 = 0;
	for (int i = 1;1; i++)
	{
		cin >> num3;
		if (num3 > num1)
		{
			cout << "猜大了" << endl;
		}
		else if (num3 < num1)
		{
			cout << "猜小了" << endl;
		}
		else
		{
			cout << "猜對了" << endl;
			break;
		}
	}
	return 0;
}

// srand((unsigned int)time(NULL));隨機數種子

程式碼6:成員變數和成員函式分開儲存
只有非靜態的成員變數才屬於類的物件上

點選檢視程式碼
#include<iostream>
using namespace std;
//成員變數 和 成員函式 是分開儲存的
class Person
{
	int m_A;//非靜態的成員變數 - 屬於類的物件上
	static int m_B;//靜態成員變數 - 不屬於類的物件上
	void func(){}//非靜態的成員函式 - 不屬於類的物件上 
	static void funcc(){} //靜態成員函式 - 不屬於類的物件上
};
int Person::m_B = 190;
void test01()
{
	Person p1;
	//空物件 佔用的記憶體空間為:1
	cout << sizeof(p1) << endl;//1
	//每個空物件也應該有一個獨一無二的記憶體空間地址
}
void test02()
{
	Person p1;
	cout << sizeof(p1) << endl;//4
}
int main() 
{
	//只有非靜態的成員變數才屬於類的物件上
	test02();
	return 0;
}

程式碼7:this指標
:可以解決名稱衝突
可以返回物件本身使用*this

點選檢視程式碼
#include<iostream>
using namespace std;
class Person
{
public:
	Person(int age)
	{
		//this指標
		//this指標指向 被呼叫的成員函式 所屬的物件
 
		this->age = age;
	}
	//Person PersonAddAge(Person& p) 以值的方式去返回
	Person& PersonAddAge(Person& p)
	{
		this->age += p.age;
		//this指向的就是p2的指標 那麼*this就是指向的p2這個物件本體
		return *this;
		//返回本體需要使用引用的方式
	}
	int age;
};
//解決名稱衝突
void test01()
{
	Person p1(190);
	cout << p1.age << endl;
}
//返回物件本身使用*this

void test02()
{
	Person p1(190);
	Person p2(191);
	//p2.PersonAddAge(p1);
	Person p3(1);
	p2.PersonAddAge(p1).PersonAddAge(p3).PersonAddAge(p3);
	//鏈式程式設計思想
	cout << p2.age << endl;
}
int main()
{
	test02();
	//190+191=381
	return 0;
}

程式碼8:空指標訪問成員函式

點選檢視程式碼
#include<iostream>
using namespace std;
//空指標訪問成員函式
class Person
{
public:
	void ShowAge()
	{
		cout << "Age" << endl;
	}
	void Showage()
	{
		if (this == NULL)
		{
			return;
		}
		//cout << m_Age << endl;
		//傳入的指標是為空的(NULL)
		cout << this->m_Age << endl;

	}
	int m_Age;
};
void test01()
{
	Person* p = NULL;
	//p->ShowAge();
	p->Showage();
}
int main()
{
	test01();
	return 0;
}

程式碼9:
const修飾成員函式
首先 常函式:

點選檢視程式碼
#include<iostream>
using namespace std;
class Person
{
public:
	//this指標的本質就是:指標常量 
	//指標常量 是常量 不是指標 指標的指向是不可以修改的
	void showPerson() const//常函式
	{
		m_B = 191;
		this->m_B = 190;//未報錯
//因為 this指標的本質可以表示為:Person* const this;是一個指標常量 在Person*前面在加一個const
//const Person* const this; 就是對應得值也不可以修改了 等價於我們在成員函式後面加const 
	//所以說在成員函式後面加const 修飾的就是this指標 讓指標指向的值也不可以修改
//m_A = 100;
		// 等價於this->m_A = 100; 
		//this = NULL;//this指標是不可以修改指標的指向的

		//不想被修改值 需要在函式名字後面加const
	}
	int m_A;
	mutable int m_B;//可以在常函式當中修改成員變數的值
};
//在成員函式後面加上const 該函式稱為常函式
//常函式內部是不可以修改成員屬性的
//成員屬性宣告的時候加關鍵字mutable之後 可以在常函式當中修改
void test01()
{
	Person p;
	p.showPerson();
}
//在宣告物件的前面加上const 這個物件叫做常物件
//常物件只可以呼叫常函式

int main()
{
	test01();
	return 0;
}
其次 常物件
點選檢視程式碼
#include<iostream>
using namespace std;
class Person
{
public:
	void func()
	{
		m_A = 1;
	}
	//this指標的本質就是:指標常量 
	//指標常量 是常量 不是指標 指標的指向是不可以修改的
	void showPerson() const//常函式
	{
		m_B = 191;
		this->m_B = 190;//未報錯
//因為 this指標的本質可以表示為:Person* const this;是一個指標常量 在Person*前面在加一個const
//const Person* const this; 就是對應得值也不可以修改了 等價於我們在成員函式後面加const 
	//所以說在成員函式後面加const 修飾的就是this指標 讓指標指向的值也不可以修改
//m_A = 100;
		// 等價於this->m_A = 100; 
		//this = NULL;//this指標是不可以修改指標的指向的

		//不想被修改值 需要在函式名字後面加const
	}
	int m_A;
	mutable int m_B;//可以在常函式當中修改成員變數的值
};
//在成員函式後面加上const 該函式稱為常函式
//常函式內部是不可以修改成員屬性的
//成員屬性宣告的時候加關鍵字mutable之後 可以在常函式當中修改
void test01()
{
	Person p;
	p.showPerson();
}
//在宣告物件的前面加上const 這個物件叫做常物件
//常物件只可以呼叫常函式

void test02()
{
	const Person p; //在物件的前面 加上 const 變為常物件
	//依然不允許修改指標指向的值
	//p.m_A = 100;//no
	p.m_B = 190;//yes
	//m_B 是特殊值 在常物件下面也可以修改
//常物件只可以呼叫常函式
	p.showPerson();
	//p.func();
	//常物件 不可以呼叫普通的成員函式 因為普通的成員函式是可以修改屬性的
}
int main()
{
	test01();
	return 0;
}
**最後 today完成**