C++學習筆記
最近在學c++寫了點筆記經(jīng)驗太少因此放出來讓大家批閱,歡迎有不同的意見指正,杠精退避
void數(shù)據(jù)類型主要用于描述函數(shù)的返回值類型(返回空值or不返回值)
7289=7.289*(10*3)(科學計數(shù)法)=7.289e3(計算機版科學計數(shù)法)
c++傳變量入函數(shù)后,變量在函數(shù)體內改變,但操作不會保留,在函數(shù)體外變量的值不變:
int a=1;
void textText(int num){
num++;
cout<<num<<endl;
}
cout<<a<<endl;
textText(a);
cout<<textText(a)<<endl;
cout<<a<<endl;
運行結果為
(
2
1
1
)
可見變量a的值在函數(shù)體外并未改變,但在函數(shù)體內確實改變了,函數(shù)的操作并不會影響函數(shù)體外的變量,但某些情況下我們需要函數(shù)體外的變量保留傳入函數(shù)體內的操作因此需要引用即:
void textText(int& num){
num++;
cout<<num<<endl;
}
引用傳入的是被引用變量的內存,相當于指針,引用變量和被引用變量共享內存地址,引用變量不能直接引用常數(shù):
int b; int& ref_b=b; 此處ref_b相當于變量b的一個別名。
const設置不可改變的常量例如:cosnt flot pi=3.1415926 此時pi不可以進行pi++自增操作,因為pi被設定為不可更改的常量const也可用于改變引用傳遞的參數(shù)類型如void canPastnumber(const int& num);
在此函數(shù)中若無const,傳入的參數(shù)是變量,即為值的內存地址經(jīng)過函數(shù)操作后傳入的變量經(jīng)歷的操作是保存的,加上const后傳入函數(shù)的參數(shù)是常數(shù)或者說是傳入了值,值在經(jīng)歷函數(shù)的操作后是不變的,且此時此函數(shù)已經(jīng)不能傳遞變量,只能傳遞常量。
函數(shù)重載
int funtion1(int a;int b);
int funtion1 (float c ,char d);
函數(shù)重載指函數(shù)名相同但傳入?yún)?shù)不同的函數(shù)僅僅改變函數(shù)類型是沒有用的如:
int funtion2();float funtion2();這兩個函數(shù)聲明是錯誤的,并不能重載
結構體與枚舉類似,都是在自定義一個數(shù)據(jù)類型,但操作方式大同小異:
enum MyEnum 枚舉
{
Px_Mine,
Px_Yours, 枚舉所創(chuàng)建的數(shù)值類型為常數(shù),默認情況下
Px_hers 遍歷起始值為0【0,1,2,3,.....】
};
MyEnum plays=Px_Mine; 枚舉類型調用實例;通常枚舉類型與switch語句共同使用
struct position{int x;int y; int z};
struct player 結構體
?{
int level;
float heath; 在我看來結構體更像是一個箱子把需要的操作和變量封裝起來方便統(tǒng)一調用
float damage;
position location; 在一個結構體內聲明另一個結構體的變量即為嵌套
void GetDamage(float dmg,float& hp)
{
hp-=dmg
}
void GetLocation()
{cout<< location.x<<location.y<<location.z<<endl;}
};
player Nomber1;
Nomber1.level=10;調用方式1
player Nomber2={10,100.f,20.f };調用方式2,對應結構體進行初始化
Nomber1.GetDamage(damage,heath);結構體內定義函數(shù)的調用
player Nomber3={10,100.f,20.f,{0,0,0}}; 對原結構體和嵌套結構體變量進行初始化
Nomber1.GetLocation();
指針
當我們創(chuàng)建一個變量時內存分配給變量的空間為(例:int i=2)4 byte,每個字節(jié)(byte)有8個位(bit)。
指針變量本身是地址,可用于訪問該內存的內容。當創(chuàng)建一個需要輸入?yún)?shù)的函數(shù),他的輸入?yún)?shù)可能是
一個非常大的結構體。當我們調用函數(shù)并將結構體作為輸入?yún)?shù)時,會復制這個結構體做為副本來初始化輸入?yún)?shù)
當這個結構體非常大時內存的傳遞效率非常低會使程序運行變慢,所以需要使用指針傳遞該結構體的地址到函數(shù),
這樣僅僅只傳遞了一個地址(十六進制的數(shù)字)將會非常高效;
int* ptr; ptr=&i cout<<ptr<<endl;`0x114514` cout<<*ptr<<endl;`2`
由此可見指針的內容是一個十六進制的數(shù)字,但訪問指針地址儲存的內容需要*解引用,因為指針ptr本身是一個地址
需要*解引用才能訪問內容。指針變量得到的是變量的地址是一個十六進制數(shù)字,當用指針變量訪問一個大型結構體
的時候,這會使程序比直接調用大型結構體更加高效。
在此插入指針和引用的區(qū)別
{
引用不可為空,指針可以為空;引用不可改變指向,指針可改變指向;引用的大小是被引用變量的大小,
引用只是個別名,指針的大小是四個字節(jié);引用可以直接訪問內存內容,指針需要*解引用。
總之:指針指向一塊內存,它的內容是所指內存塊的地址;而引用是某塊內存的別名,引用不可改變指向。
}
指針實操記錄:
1.0
int main(){
int a=100;
int* aPtr;
aPtr=&a; 需要與位符引用變量a
int numbers[]={0,1,2,3,4,5,6} 創(chuàng)建并初始化數(shù)組
aPtr=numbers; 指針獲取數(shù)組的地址值需賦值數(shù)組的名字(與獲取變量地址大有不同)
for(int i=0;i<6;i++)
{
cout<<aPtr<<*aPtr<<endl; 從輸出結構可知將數(shù)組地址賦予指針獲取到的是第一個元素的地址(numbers[0])
aPtr++; 指針可以做自增等操作,可以用于遍歷數(shù)組內的所有元素
}
}
2.0
struct position {
int x;
int y;
int z;
string name; 創(chuàng)建結構體
};
int main() {
position P_1 = {0,0,0,"CXK"}; 初始化結構體
position* structPtr;
structPtr = &P_1;
for (int i = 0; i < 4; i++)
{
cout << structPtr << endl; 輸出值為四個十六進制內存地址
structPtr++;
}
system("pause");
} 由此可見結構體變量P_1的性質介于變量和數(shù)組之間可以進行遍歷,但也需要&獲取地址
同時我也進行了一些視頻沒有涉及到的操作并給予出基于我當前認知水平的解釋
int main() {
position P_1 = {0,0,0,"CXK"};
position* structPtr;
structPtr = &P_1;
2.1//cout << structPtr << endl; 獲取的是變量 P_1 首個元素的地址
2.2//cout << *structPtr << endl; 無法運行,因為P_1 里有四個元素,指針一次只能讀取一個,同時結構體指針無法通過遍歷獲取變量P_1 的內容
2.3//cout << structPtr->name or |(*structPtr).name |<< endl; 這是結構體指針訪問變量元素的方式只能一個一個訪問??此次保持質疑
2.4for (int i = 0; i < 4; i++){cout << structPtr <<structPtr->name<< endl;structPtr++;} 此處運行結果為輸出第一個元素的地址加第四個元素的內容換行;輸出第二個元素的內容然后報錯cmd運行終止。對于此處我的猜想是遍歷第二次時結構體指針的地址改變?yōu)橹赶蜃兞縋_1的第二個元素,這使得指針不再指向變量P_1,因此遍歷第二次無法獲取name的值,我猜想這也許和結構體變量介于變量和數(shù)組之間的性質有關
如有正確觀點歡迎指正萌新
system("pause");
}
學習于以下鏈接:
【【中字精譯】《為游戲編程學習C++》? 全網(wǎng)最好的C++入門教程】 https://www.bilibili.com/video/BV1Dd4y1R7VS/?share_source=copy_web&vd_source=5c9d82b5bcf240e778cfd9337f3dfd50