C++基本语言:1.3auto、头文件、引用、常量

C++基本语言包含10章节内容,存于C++从入门到精通专栏

目录

(1)局部变量和初始化:C++中随时用到随时定义

(2)auto:变量的自动类型推断

(3)头文件防卫式声明

(4)引用

(5)常量:不变的量

(6)constexpr 关键字


1)局部变量和初始化:C++中随时用到随时定义

在C语言中,如果某个函数中需要用到一些局部变量,那么局部变量都会集中定义在函数开头

而在C++中不必遵循这样的规则, 随时用随时定义即可。当然,作用域一般就是从定义的地方开始到该函数 结束为止。

for(int i=0;i<100;i++){…},i的作用域就仅仅限制在 for循环体内

传统编码方式中,可以使用“=”在定义变量的时候进行初始化  如int abc=5;

在C++新标准中,可以使用“{}”在定义变量的时候进行初始化  int abc{5};

也可以写成 int abc={5};等号可以有,也可以没有

数组定义:({}里面包含一组数据的情况)

一般地,int abc =3.5f 会被截断,abc=3,丢失了0.5

但是,如果int abc{3.5f} //无法编译成功,会报错。

只有int abc{3}可以运行通过

这样做的好处是不会使数据被误截断,进一步保证所写的代码的健壮性。

2auto:变量的自动类型推断

auto可以在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的类型(这表明在声明变量的同时也要给变量初始值)

auto的 自动类型推断发生在编译时期,所以使用auto并不会造成程序运行时效率的降低

在定义一个变量的时候,如果变量类型能够由系统推断出 来,就不需要显示指定类型。

C++基本语言:1.3auto、头文件、引用、常量_第1张图片

上面分别是bool,char,float,int

有些类型名很长,如后面要学习到的泛型,那么,使用auto就能避 免书写很长的类型名。

3)头文件防卫式声明

C/C++头文件中有关于#ifndef、#define、#endif的用法

下面会造成重定义

C++基本语言:1.3auto、头文件、引用、常量_第2张图片

C++基本语言:1.3auto、头文件、引用、常量_第3张图片

C++基本语言:1.3auto、头文件、引用、常量_第4张图片

上图也就相当于

C++基本语言:1.3auto、头文件、引用、常量_第5张图片

这就有点类似于你include了两次一样的头文件,就会造成重定义

如何解决呢?———— 条件编译

#ifndef 标识符 

   //程序段

#endif

改造后的文件:保证中间的东西只会被定义一次

C++基本语言:1.3auto、头文件、引用、常量_第6张图片

C++基本语言:1.3auto、头文件、引用、常量_第7张图片

4)引用

引用是为变量起的另外一个名字(别名),一般用“&”符号表示。起完别名后,这个别名与变量本身,我们就看成是同一个变量。

定义引用并不额外占用内存。或者也可以理解成,引用和原变量占用的是同一块内存。

以下行为会报错

int &refval2;//报错

int &refval3=3;//报错,引用需要绑定到变量上去;绑定到对象上也可以。但不能绑定到常量上去。

float &refval4=value;//不可以,类型要相同

区别于 int *p=&a; //注意&在等号的右边

 

引用的例子,当作形参传递到函数里面;函数运行结束,其可以被带出来

C++基本语言:1.3auto、头文件、引用、常量_第8张图片

5)常量:不变的量

const表示不变的意思。

定义变量时,可以在前面增加const关键字,一 旦增加该关键字,该变量的值就不可以发生改变。

var的值到底是否可以修改?实际上可以修改,但强烈建议不要这样做,以免产生问题,既然承诺为const,就不要修改它的值

如何修改var值,看如下代码:

你在编译器,加断点调试的时候,看他俩的地址确实是一个东西;

但是如果你用cout打印出来,你会发现他两一个是17,一个是5

说明:引用,表面上看是一个东西;但实际上,系统会给别名新开辟一块内存(不用管)

6constexpr 关键字

c++才引用,也代表一个常量的概念,意思是在编译的时候求值,所以能够提升运行时的性能

C++基本语言:1.3auto、头文件、引用、常量_第9张图片

那func1函数要怎样写呢?这里必须注 意,因为var2是常量,初始化时调用了func1函数所以func1也得定义 成constexpr

C++基本语言:1.3auto、头文件、引用、常量_第10张图片

C++基本语言:1.3auto、头文件、引用、常量_第11张图片

在书写func1函数时必须小心,其中的代码尽可能简单。而且,某些代码出现在func1函数中还会导致编译无法通过。

例如,在 func1函数中定义一个未初始化的变量就会导致编译出错,必须在定义的时候初始化

如果常规调用,内部可以放for(int i=0;i<100;i++){cout<

如果 constexpr int var2=fun1()//报错

演示

C++基本语言:1.3auto、头文件、引用、常量_第12张图片

然后运行下面代码

括号里面的代码其实是没有运行的

不难发现,尽管设置断点调试时,var和var2看起来值相等,但是上 面这个条件却不成立,这几乎可以肯定是编译器内部进行了一些特殊的处理。虽然在Visual Studio 2019中var和var2代表同一块内存(跟踪调试时观察到的)但应该只是假象,原变量(var)应该和别名(var2)处于不同的内存中。

常量的用途 比如 switch case

你可能感兴趣的:(C++从入门到精通,c++,开发语言)