C++入門到進階(圖文詳解,持續更新中)
目錄
C++入門到進階(圖文詳解,持續更新中)
數據
數據類型
基本數據類型/內置數據類型
C++常用運算符
賦值運算符
關系運算符
邏輯運算符
雜項運算符
數據的本地化存儲
一、準備工作:
二、寫流即向本地文件中寫入數據該如何實現?
1.創建寫流的對象或創建寫流的變量
2.打開文件執行,準備執行寫數據(稱為開流)
3.對本地寫數據
4.關閉流
三、讀流(即從本地文件中讀取數據)
1.創建讀流對象
2.打開文件準備讀取數據(稱為開流)
3.開始從本地讀取數據
4.關閉流
函數
函數的聲明和定義
?編輯
函數傳值
傳出數據(即返回值)
傳入數據(即傳參)
1.什么是傳參?
2.作用
3.類型
4.關于形參在函數聲明和函數定義中注意點
5.默參
6.函數重載
7.傳參方式
面向對象
數據
數據類型
基本數據類型/內置數據類型
整型:有符號與無符號
int
unsignedf int
long
unsigned long int
short int
ushort
byte
sbyte
long int
unsigned long int
浮點型/實型:
float
double
long double
字符型:
char
布爾型:
bool
C++常用運算符
賦值運算符
基本賦值運算符:=
復合賦值運算符:+=(加賦值)、-=(減賦值)、*=(乘賦值)、/=(除賦值)、%=(求余賦值)、 <<=(左移賦值)、>>=(右移賦值)、&=(按位與賦值)、|=(按位或賦值)、*A=(按位異或賦值)
關系運算符
== != < > <= >=
邏輯運算符
&& || !
雜項運算符
sizeof和三目運算符
數據的本地化存儲
一、準備工作:
實現本地化存儲需要
頭文件為:iostream,ofstream
引入頭文件
#include<iostream>
#include<ofstream>
命名空間為:std
引入命名空間:
using namespace std;
二、寫流即向本地文件中寫入數據該如何實現?
使用ofstream的方法,操作步驟為:
1.創建寫流的對象或創建寫流的變量
ofstream ofs;
2.打開文件執行,準備執行寫數據(稱為開流)
ofs.open("abc.txt", ios::out);
3.對本地寫數據
string name;
getline(cin, name,'q');
ofs << name << endl;
4.關閉流
ofs.close();
三、讀流(即從本地文件中讀取數據)
1.創建讀流對象
?ifstream ifs;
2.打開文件準備讀取數據(稱為開流)
ifs.open("abc.txt", ios::in);
3.開始從本地讀取數據
方法1:
?char ValueArrays[1024]{};?while (ifs >> ValueArrays)//非零即為真
? ? {
? ? ? ? cout << ValueArrays << endl;//這是字符串的打印
? ? }方法2:
string str = " ";
? ? while (ifs >> str)
? ? {
? ? ? ? cout << str << endl;
? ? }
4.關閉流
?ifs.close();
存儲案例展示:(存儲數據到UserInfo的txt文本中,讀取數據,新增數據,查找相關姓名、年齡、地址)
#include <iostream>
#include<fstream>
#include<string>
#include"User.h"
/*
預處理
#include中的" "和<>的使用
<>:代表的導入C++庫文件
“ ”:先檢索是否有沒有自己寫的頭文件,如果檢索不到自己寫的頭文件,會自動查找C++庫,找不到就報錯
*/using namespace std;
void Save()
{using namespace std;ofstream ofs;ofs.open("abc.txt", ios::out);string name;getline(cin, name,'q');ofs << name << endl;ofs.close();}
int name_index = 0;
void Add(string nameArrays[])//name是一個形參,需要一個string 類型數組的地址
{string name = " ";cin >> name;nameArrays[name_index] = name;name_index++;ofstream ofs;ofs.open("abc.txt", ios::out);for (int i = 0; i < name_index; i++){ofs << nameArrays[i] << endl;}ofs.close();
}void GetValue()
{using namespace std;//1. 創建對象ifstream ifs;//2. 開流ifs.open("abc.txt", ios::in);//3.讀取數據,方法1//3.1數據本地讀取出來了,需要找到一個容器去存放讀取出來的數據char ValueArrays[1024]{};//3.2開始取出數據,并將本地數據在數據中while (ifs >> ValueArrays)//非零即為真{cout << ValueArrays << endl;//這是字符串的打印}ifs.close();cout << "---------" << endl;//3.讀取數據,方法2//3.1數據本地讀取出來了,需要找到一個容器去存放讀取出來的數據//讀取不走回頭路ifs.open("abc.txt", ios::in);string str = " ";while (ifs >> str){cout << str << endl;}ifs.close();cout << "--------" << endl;//3.讀取數據,方法3 借助一個ifstream里的一個函數getlineifs.open("abc.txt", ios::in);char buf[1024]{};while (ifs.getline(buf, sizeof(buf)))//getline是ifstream下的一個函數,用于獲取到一行數據,函數的第一個參數是用于接收一行數據的字符數組,//第二個參數是用于接收數據的容器的大小{cout << buf << endl;}ifs.close();cout << "--------" << endl;//3.讀取數據,方法4 借助一個string里的一個函數getlineifs.open("abc.txt", ios::in);string str_buf = {};while (getline(ifs, str_buf)){cout << str_buf << endl;}ifs.close();cout << "--------" << endl;//3.讀取數據,方法5 借助一個ifstream里的一個函數eofifs.open("abc.txt", ios::in);char eof_buf[1024]{};while (!ifs.eof()){ifs >> eof_buf;cout << eof_buf << endl;}ifs.close();
}void SetValue()
{string name = " ";string age = " ";string address = " ";cout << "請輸入姓名:" << endl;cin >> name;cout << "請輸入年齡:" << endl;cin >> age;cout << "請輸入地址:" << endl;cin >> address;ofstream ofs;ofs.open("Value.txt", ios::out);ofs << name << " ";ofs << age << " ";ofs << address << endl;ofs.close();
}void SelValue()
{string r_name = " ";string r_age = " ";string r_address = " ";ifstream ifs;ifs.open("Value.txt", ios::in);while (ifs >> r_name && ifs >> r_age && ifs >> r_address){cout << "姓名:" << r_name << ",年齡:" << r_age << ",地址:" << r_address << endl;}ifs.close();
}//增加用戶
User uArray[6] = {};
int uSize = 0;
void AddUser()
{string name;int age;string address;cout << "輸入姓名:" << endl;cin >> name;cout << "輸入年齡:" << endl;cin >> age;cout << "輸入地址:" << endl;cin >> address;User uInstance;uInstance.name = name;uInstance.age = age;uInstance.address = address;uArray[uSize] = uInstance;uSize++;ofstream ofs;ofs.open("UserInfo.txt", ios::out);for (int i = 0; i < uSize; i++){ofs << uArray[i].name << " ";ofs << uArray[i].age << " ";ofs << uArray[i].address << endl;}ofs.close();
}int Find(string name)
{for (int i = 0; i < uSize; i++){if (uArray[i].name == name){return i;}}return -1;
}//查詢所有人的所有信息
void SelAllUser()
{ifstream ifs;ifs.open("UserInfo.txt", ios::in);//is_open判斷上一行代碼中打開的文件是否存在//存在返回真,不存在返回假/*if (ifs.is_open()){cout << "文件存在" << endl;}elsecout << "文件不存在" << endl;*/if (!ifs.is_open()){cout << "文件不存在" << endl;return;//文件不存在,下方邏輯不用執行}char buf[1024];ifs >> buf;if (ifs.eof()){cout << "文件存在,但沒數據" << endl;return;//下方邏輯無需進行}ifs.close();ifs.open("UserInfo.txt", ios::in);int i = 1;string name;int age;string address;while (ifs >> name && ifs >> age && ifs >> address){cout << "第" << i << "人的姓名是" << name << ",年齡是" << age << ",地址是" << address << endl;}}
//查詢某個人的所有信息
void SelUser()
{cout << "輸入名字" << endl;string sel_name = " ";cin >> sel_name;int index = Find(sel_name);//Find()會返回一個int類型的值if (index != -1) {}//ifstream ifs;ifs.open("UserInfo.txt", ios::in);string name = " ";int age = 0;string address = " ";while (ifs >> name && ifs >> age && ifs >> address){if (name == sel_name){cout << "用戶名為:" << name << ",年齡是:" << age << ",地址是:" << address << endl;}}
}
//初始化
int Init()
{ifstream ifs;ifs.open("UserInfo.txt", ios::in);if (!ifs.is_open()){cout << "文件不存在" << endl;return -1;//文件不存在,下方邏輯不用執行}char buf[1024];ifs >> buf;if (ifs.eof()){cout << "文件存在,但沒數據" << endl;return -1;//下方邏輯無需進行}ifs.close();ifs.open("UserInfo.txt", ios::in);int i = 0;string name;int age;string address;while (ifs >> name && ifs >> age && ifs >> address){uArray[i].name = name;uArray[i].age = age;uArray[i].address = address;i++;}return i;
}
int main()
{ //string str = {};//getline(cin, str, 'q');//控制臺輸入數據,賦值到str中,按q鍵再按回車鍵結束//getline(cin, str, '\t');//控制臺輸入數據,賦值到str中,按Tab鍵然后再按回車結束//cout << str << endl;//Save();//GetValue();//SetValue();// SelValue();int addIndex = Init();while (true) {cout << "添加:1,查詢:2,退出:0" << endl;int selecter;cin >> selecter;switch (selecter){case 0:exit;break;case 1:AddUser();break;case 2:SelAllUser();break;}}system("pause");
}
函數
函數的聲明和定義
函數聲明的作用:代表的是函數的出生位置(占位置的),如果在文件最上方的位置聲明了函數,不用擔心函數和函數之間互相調用編譯不通過的問題
函數的定義:為函數聲明寫函數體(寫邏輯)
注?:可能出現的bug,函數只有聲明,沒有定義,這個函數卻被調用了,被編譯時期的異常error
函數傳值
傳出數據(即返回值)
作用:在函數內傳數據出函數
樣式:
返回類型 函數名稱(參數)
{
? ? ? ? return 對應返回類型的值;
? ? ? ? //此處的return有雙重作用:
? ? ? ? 1.跳轉語句(跳出函數)
? ? ? ? 2.返回值
}
可以返回的值:
1.對應返回類型的值
2.對應返回類型的變量
3.帶同種返回類型返回值的函數調用——先執行函數調用,再返回值
傳入數據(即傳參)
1.什么是傳參?
傳參就是實參傳入形參
2.作用
在函數外部傳入數據到函數內部
3.類型
形參:在函數聲明和定義的時候寫的是行參
實參:在函數調用的時候 傳遞的值是實參
實參的種類:
(1)對應形參類型的值
(2)對應形參類型的變量
(3)帶同種返回類型返回值的函數調用,即先執行函數調用,再傳參數(實參傳參數)
4.關于形參在函數聲明和函數定義中注意點
(1)聲明的形參參數名稱和定義的形參參數名稱
(2)可以不一樣聲明的時候可以省略參數名稱
(3)如果存在函數的默參,默認是必須寫在函數聲明位置的,不可以在聲明和定義中都寫一遍默參
5.默參
作用:函數可以在聲明或者定義的時候給出默認的邏輯執行
-
關于默參的放置位置說明
-
如果只有一個默參
-
放在參數結尾處(最右側)
-
-
如果有多個默參
-
從右到左依次給出默參,中間不可以隔開使用
-
錯誤演示:void Function(int i=10,int a,bool b=false)
-
正確演示::void Function(int i=10,int a=10,bool b=false)
-
-
-
6.函數重載
-
函數名相同,但是函數參數(參數類型)不同,通過傳入不同的實參,調用不同的函數,執行不同的功能
-
注意:
-
函數返回值不參與函數重載的過程
-
如果被重載的函數中出現了默參
-
建議不要寫成重載函數
-
如果不接受建議,就需要保證默參的幾個參數類型與其他被重載的函數的參數不一致
-
-
7.傳參方式
(1)值傳遞:值傳遞只能影響本函數,值的修改不會影響其他的功能,也不會影響到實參
(2)地址傳遞
(3)引用傳遞
面向對象
待更新.....