目录
auto是什么?有什么作用?
int main()
{
const int a = 0;
int b = 0;
//自动推导c的类型
auto c = 'a';
auto d = 'A';
auto e = 1.34;
//typeid 打印变量的类型
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
cout << typeid(e).name() << endl;
return 0;
}
这里我们可以看出,auto能自动推导类型,在一些特殊场景下编译器会优化,比如:
int main()
{
int x = 10;
auto a = &x; //int*
auto* b = &x; //int*
auto& c = x; //int
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
*a = 20;
*b = 30;
c = 40;
return 0;
}
我们需要注意的是,如果是const修饰的变量,auto会自动去掉const,即默认可读可写,当然,如果用const auto就是只读的了。
auto也不能推导所有类型,首先,auto不能做参数,其次,auto不能推导数组。
//auto不能作为参数,因为编译器无法对a的实际类型进行推导
//void TestAuto(auto a)
//{}
//auto不能推导数组
//int main()
//{
// int i = 0;
// auto j = i;
// //auto b[] = { 4, 5, 6 };
// return 0;
//}
在哪些场景下会用到auto呢?
由于auto能自动推导类型,当类型名很长的时候,可以用auto(后面具体问题具体分析),还有就是范围for。
//void TestFor(int a[]) //这里a是指针
//{
// //范围for必须是数组名
// for (auto& e : a)
// cout << e << endl;
//}
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
//TestFor(array);
//我们以前遍历数组
for (int i = 0; i < sizeof(array) / sizeof(int); ++i) //i的生命周期是整个循环
{
cout << array[i] << endl;
}
//范围for的使用
//自动依次取数组array中的每个元素赋值给e
for (auto e : array) //e 局部变量,生命周期是一次循环
{
cout << e << endl;
}
for (int x : array) //自己写类型也是可以的
{
cout << x << endl;
}
//把数组中每个值加1
for (auto& e : array) //加了引用就能对值修改了
{
e++;
}
for (auto e : array)
{
cout << e << endl;
}
return 0;
}
下一个知识点:在C语言阶段,空指针我们经常用NULL,但是在C++阶段,推荐使用nullptr,因为,在C++中,把NULL定义成0。看下面代码,我们可以看出,在一些特殊场景下使用NULL会出错。
void f(int)
{
cout << "f(int)" << endl;
}
void f(int*)
{
cout << "f(int*)" << endl;
}
int main()
{
// C++ 98/03
int* p1 = NULL;
int* p2 = 0;
//C++11初始化空指针推荐使用 nullptr(关键字)
int* p3 = nullptr;
f(NULL); //f(int) 这里是传指针,但是接收错了
f(0); //f(int)
f(nullptr); //f(int*) 传这个就没错了
return 0;
}