C++基本入門教程(七):一些比擬特殊的基本語法總結。本站提示廣大學習愛好者:(C++基本入門教程(七):一些比擬特殊的基本語法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++基本入門教程(七):一些比擬特殊的基本語法總結正文
此次又到了比擬簡略的內容了,引見了一些根本的輪回掌握、關系表達式、邏輯掌握等。
這裡就簡略抽一些略微比擬特殊的內容來吹吹水,不,是來總結一下吧~
1、i++和++i
不,我不是來說明i++和++i的差別的,只是書上提到一點,在應用for輪回的時刻,倒底i++和++i有無差別呢?
謎底是:簡直沒有,隨意你用哪個。
然則,要略微留意一下兩種方法的外部處置方法:
i++:先復制一個i的正本,然後將i加1,最初前往i的正本。
++i:將i加1,然後前往i。
這麼一說,年夜家都曉得誰的效力更高,但關於如今的編譯器而言,是會主動優化的(但不曉得是否是一切編譯器都如許)。
然後,C++是許可自界說操作符的行動的,也就是說,我們可認為本身的類界說++操作,這時候候,復制類的正本,消費顯著就不克不及疏忽不計了。
這個,就不多說了。
2、逗號運算符
逗號運算符可以將多條語句放到一路,如:
for (int i = 2, j = 10 * i; i < 999; i++) {
cout << j;
break;
}
int i = 2, j = 10 * i;就是逗號表達式了,那末,j的值是若干呢?沒錯,是20。
再來, 如許:
int num = 0;
num = 10, 50;
留意,聲明變量賦值的時刻是不克不及應用逗號表達式的,這個本身在編譯器編譯一下就曉得了~規矩這器械,沒需要逝世記~
這裡的num值是若干呢?沒錯,是10,由於賦值比逗號表達式優先級要高,所以先把10賦值給num,前面的50被捨棄了。
那末,如許呢:num = (10, 50); 成果是50,由於括號的優先級比賦值語句高,逗號表達式沾了光,所以最初是把50賦值給了num。
然則,假如有誰非特別情形下用如許的賦值情勢,那末,我包管不打逝世他。
3、類型別號(typedef)
這又是老手的一個痛點,年夜部門首次接觸Cocos2d-x的同伙,必定被這兩條語句嚇逝世過:
typedef void (Ref::*SEL_SCHEDULE)(float);
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
這看似神龐雜的器械,倒底是甚麼?這其實就是我們應用schedule准時器功效時要用到的。
這裡先放著。
我們先來看看最簡略的typedef用法:
typedef int IQ;
IQ mutouIQ = 250;
int normalIQ = 1;
所謂類型別號,就是給某個類型的名字取個綽號,好比我們把應用IQ取代int,如上代碼。
應用typedef int IQ,就代表把int取了個體名,叫做IQ,今後便可以用IQ來界說整數了。
粗鄙地說,IQ就是int,int就是IQ,懂了吧~
再來看看這個:typedef char* mpointer;
那末,我們今後便可以應用mpointer來界說char類型的指針。
年夜家有無發明甚麼?
假如把typedef去失落,就釀成如許:
int IQ;
char* mpointer;
沒錯,IQ和mpointer就像是一個變量名(在下面這段代碼裡它們就是變量名)。
成果就是,在聲明變量以後,後面加上typedef,就然後這個變量成了類型的別號。
很好懂得吧?今後看到typedef很龐雜的,就把typedef去失落,看看是聲明的甚麼變量,那這個體名就是代表如許的變量了。
接上去,再回到那神龐雜的兩條語句:
typedef void (Ref::*SEL_SCHEDULE)(float);
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
先看第一條,很龐雜,我們把typedef去失落,釀成:void (Ref::*SEL_SCHEDULE)(float);
這是甚麼,其實我也說明不了,我C++很水的,但,這顯著就是一個“函數變量”(臨時這麼稱謂它)。
一個前往值為void,參數為float的函數,而且限制其類為Ref,怎樣樣,很好懂得吧。
把typedef放歸去,這句代碼就是把SEL_SCHEDULE界說為上述所說的那種函數。
接著看第二條代碼,這是一個宏:
1.schedule_selector是宏的稱號
2._SELECTOR是宏的參數
3.static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)簡化為static_cast<SEL_SCHEDULE>(&_SELECTOR),這是強迫類型轉換,將傳遞出去的_SELECTOR轉換為某品種型
4.轉換為何類型呢?沒錯,就是SEL_SCHEDULE類型,SEL_SCHEDULE是甚麼類型?方才曾經說明過了,一個前往值為void,參數為float,其類為Ref的函數
最初,看看我們日常平凡是怎樣應用schedule_selector的:
this->schedule(schedule_selector(HelloWorld::update));
成果就是把我們的HelloWorld的update函數轉換成了SEL_SCHEDULE類型,然後傳遞給schedule函數。
呼,這回明確了吧,最初看看我們的update函數是若何界說的:void update(float dt);
前往值為void,參數為float,HelloWorld類繼續了Layer(終究也是繼續了Ref的)。
update函數的類型和SEL_SCHEDULE的根本上一樣,除類的類型之外。
但由於Layer的終究基類是Ref,所以可以把update函數強迫轉換為SEL_SCHEDULE類型。
好了,我再說明下去的話,就愈來愈說欠亨了,就到這裡吧~
4、新的for輪回(c++11)
C++11新增一種for輪回語法,可以很便利地遍歷數組、vector和array。
應用很簡略,以下:
int nums[3] = { 1, 2, 3 };
for (int num : nums) {
}
如許就可以把nums的值以此賦值給num,從而遍歷全部數組,不多說喇~
5、cctype尺度庫
我問年夜家一個成績,給你一個字母A,要斷定它是年夜寫還小寫,你怎樣斷定?
(小若:你都說了是字母A了,固然是年夜寫的啊!要斷定嗎?)
咳咳~!法式!我們是法式員,不克不及這麼簡略地去斷定~!如許不嚴謹~!
我們應當如許:
char c = 'A';
if(c >= 'A' and c <= 'Z') {
// 嗯,是年夜寫
}
普通人應當都邑這麼想吧?(小若:不,普通人都曉得A是年夜寫,不消斷定)
其實如許不平安,萬一字符編碼不是ASCII呢?有能夠謎底就紛歧樣了。
因而,我們應當如許寫:
char c = 'A';
if (isupper(c)) {
// 嗯,是年夜寫
cout << "yes";
}
isupper是cctype庫的函數,用來斷定字母能否是年夜寫。
如許就更便利和通用了,
cctype庫在頭文件ctype.h裡(或許cctype裡),關於這個庫的更多函數,百度一下,會有許多~
6、停止
好了,此次就到這裡吧,C++果真不是我愛好的器械,能吹水的處所比擬少(都是比擬嚴謹的器械),我還能保持多久呢?~