C++基础入门教程(八):函数指针(2)
Sprite和Value都是Cocos2d-x常用的,这里的参数为什么是指针?
因为值引用的参数是会拷贝一份的,这样才不会影响原本的值,拷贝一份就会有额外的开销。
一般类的开销都比较大(相对于int、float等基本类型而言),所以拷贝一份不太合适。
而且我们通过都需要在函数里改变Sprite的坐标、大小等属性,如果使用值传递的话,就无法修改了(修改的只是拷贝的那一份)。
当然,这个还要看具体项目的情况,我不唠叨了,太深入不好吹水。
五、不想拷贝,又不想值被修改,怎么办?
拷贝开销大,使用指针参数又很可能在函数被修改了值,怎么办呢?
这时候就要用const限定符了,如下代码:
void play(const Sprite* sp) {
}
这样在函数内部既不会修改sp指向的值,又可以避免值传递的额外开销。
六、函数内部的变量离开函数时就会被释放
我们之前说过,只要不是new出来的变量,那么,在离开作用范围后,就会被自动释放。
但是,来看看这个函数:
int getNum() {
int num = 10;
return num;
}
既然变量离开作用范围后会被释放,那么,num在离开getNum函数后,就会被释放。
这时候return num的意义何在呢?getNum函数真的能成功获取到数字10吗?
答案是肯定的。
因为return 在返回num的时候,实际上是拷贝了一份的,返回的是拷贝的值,释放的是原来的变量。
这就是return的秘密了。
但是,指针就不行了,看看下面的代码:
// 假设有这样一个结构体
struct People {
int age;
};
People* getNewPeople() {
People nPeople;
nPeople.age = 20;
return &nPeople;
}
这个函数返回的是一个指向People结构体类型的内存地址。
按照return的规则,返回的时候实际上是拷贝了一份,但这个时候拷贝的只是一个指针,也就是一个内存地址。
这个内存地址仍然指向函数内部的nPeople变量。
所以即使getNewPeople函数成功返回了一个指针,但这个指针指向的内存地址上的值仍然是被释放了。
也就是说,我们获取的只是一个野指针。
七、结束
好了,这篇写得有点糟糕,太多内容了,我只是抽取部分来吹吹水~