C++基础入门教程(七):一些比较特别的基础语法总结(2)
先看第一条,很复杂,我们把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类型。
好了,我再解释下去的话,就越来越说不通了,就到这里吧~
四、新的for循环(c++11)
C++11新增一种for循环语法,可以很方便地遍历数组、vector以及array。
使用很简单,如下:
int nums[3] = { 1, 2, 3 };
for (int num : nums) {
}
这样就能把nums的值以此赋值给num,从而遍历整个数组,不多说喇~
五、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里),关于这个库的更多函数,百度一下,会有很多~
六、结束
好了,这次就到这里吧,C++果然不是我喜欢的东西,能吹水的地方比较少(都是比较严谨的东西),我还能坚持多久呢?~
- 上一篇:C++基础入门教程(八):函数指针
- 下一篇:c++几种基本的插入排序(图文)