cpp基础【3】
auto关键字
auto自C++11以后,被赋予了全新的含义,这里引用一下官方介绍:auto不再是一个储存类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
看不懂?没关系,我来翻译成人话,上一段代码先:
int main() {
int a = 66;
auto b = a;
auto c = 'a';
//auto e; 无法编译成功,auto定义变量时必须初始化
return 0;
}
看到这里,相信有一部分人已经反应过来了,auto其实是一个懒人包,对于懒得去查看或者输入变量类型的人来讲,直接打上auto会如虎添翼,因为电脑会自动识别并替换为变量的实际类型,下面的例子也很好的说明了使用auto定义必须初始化。
当然了,auto还有更高级的使用方法,举个栗子先:
int main() {
int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;
auto m = 1, z = 9;
//auto d = 8, x = 4.01; 无法通过,因为d和x不是同一类型
return 0;
}
首先当auto和指针和引用结合起来,显而易见,aotu和aotu没有任何区别,但是aotu如果表示定义的变量是一个引用类型的话,那必须是auto&*;其次,auto可以一行定义多个变量,但是要保证变量的类型是相同的,否则会报错。
讲到这里了,那么auto的用处只有这么少?看着还是很鸡肋?当然不是!下面介绍一个很经典的用法:语法糖,先举个栗子:
int main() {
int a[] = { 2,4,8,56,9,6,3,4 };
for (auto e : a) {
cout << e << endl;
}
return 0;
}
输出结果便是该数组的全部成员,方法简单实惠,像吃了糖一样爽,好用,爱用。
但是其实,该方法的学术用语叫做范围for语法,冒号将其分为前后两部分,第一部分为范围内用于迭代的变量,另一部分则是表示迭代的范围。(tips:迭代的范围必须是确定的,不可以说一个函数的参数是一个指针,然后在参数里使用语法糖,因为该函数的数组是不确定的。)
指针空值nullptr
在传统的c语言中,我们知道NULL是一个空指针,但是在c++98中,它被是为是常量0,而不是无类型指针 (void*),因此则会闹出很多问题,比如函数参数是指针,但是在c++程序里,填NULL则会产生参数错误。
因此,c++11后,nullptr产生了,作为一个新关键字,因此不需要包含任何头文件,它代表了过去c语言中的NULL,即指针空值,sizeof(nullptr)和sizeof((void* )0)所占的字节数是相同的,因此,建议以后表示空指针,直接使用nullptr。
总结
今天先谈到这里,由于类和对象过于复杂,我决定单开一个章节来说。