2.2 auto使用细则
🪆auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和aauto*没有任何区别,但是auto声明引用类型时,必须要加&,如下,如果c不加&的话,就是x的一份拷贝。
int main() { int x = 10; auto a = &x;//根据右边推出,a是一个指针类型 auto* b = &x;//右边必须是一个地址,因为前面加了* auto& c = x;//引用必须要加& }
🪆在同一行定义多个变量
当在同一行声明多个变量的时候,这些变量必须是相同的类型,否则编译器会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
int main() { auto a = 10, b = 30; auto c = 60, d = 1.1;//该行编译失败,c和d的初始化类型不同 }
2.3 不能使用auto的场景
- auto不能作为函数的参数
//错误,编译器无法对x的实际类型进行推导 void Text(auto x) {}
·auto不能直接用来声明数组
void Text() { //auto arr[] = { 1, 2, 3 };//错误写法,请勿模仿 int arr[] = {1, 2, 3}//这才是正确写法 }
小Tips:auto在实际中常被用在:基于范围的for循环中、还有lambda表达式中、其次就是一些非常非常长的类型,也会用auto进行替换。
三、基于范围的for循环
🪆C++98中遍历一个数组:
void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)//通过下标访问 array[i] *= 2; for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)//通过指针访问 cout << *p << endl; }
🪆C++98中遍历一个数组:
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还容易犯错误。因此C++11中引入了基于范围for循环。for循环后的括号由冒号“ : ”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; for(auto& e : array)//加引用可以对后面的值修改 e *= 2; for(auto e : array) cout << e << " "; return 0; }
3.1 范围for的使用条件
- for循环迭代的范围必须是确定的
- 迭代的对象要实现++和==的操作
对数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end方法,begin和end就是for循环的迭代范围。范围for本质上是迭代器,支持迭代器就支持范围for。
void Text(int arr[])//arr本质上只是一个地址,没有范围 { for (auto a : arr)//错误 { cout << a << endl; } }
四、指针空值nullptr
良好的编程习惯要求我们,在声明一个变量时最好给该变量一个合适的初始值,否则可能出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们一般会把它置空。
🪆回顾NULL:
void f(int) { cout << "f(int)" << endl; } void f(int*) { cout << "f(int*)" << endl; } int main() { f(0); f(NULL); return 0; }
上述代码的本意是:希望通过f(NULL);去调用void f(int*),但是通过执行结果可以看出,f(NULL);调用的是void f(int)。这是因为NULL被定义成了0,且C++98中规定,字面常量0,既可以是一个整型数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成一个整型常量,如果要将其按照指针的方式来使用,必须对其进行强制类型转换(void*)0。
🪆认识nullptr:
nullptr用来表示指针空值,因为nullptr是C++11作为新关键字引入的,所以在使用的时候不需要包头文件。C++11中,sizeof(nullptr)和sizeof((void*)0)所占字节数相同。
int main() { cout << sizeof(nullptr) << endl; cout << sizeof((void*)0) << endl; return 0; }
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是春人前进的动力!