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}可以运行通过。
这样做的好处是不会使数据被误截断,进一步保证所写的代码的健壮性。
auto可以在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的类型(这表明在声明变量的同时也要给变量初始值)
auto的 自动类型推断发生在编译时期,所以使用auto并不会造成程序运行时效率的降低。
在定义一个变量的时候,如果变量类型能够由系统推断出 来,就不需要显示指定类型。
上面分别是bool,char,float,int
有些类型名很长,如后面要学习到的泛型,那么,使用auto就能避 免书写很长的类型名。
C/C++头文件中有关于#ifndef、#define、#endif的用法
下面会造成重定义
上图也就相当于
这就有点类似于你include了两次一样的头文件,就会造成重定义
如何解决呢?———— 条件编译
#ifndef 标识符
//程序段
#endif
改造后的文件:保证中间的东西只会被定义一次
引用是为变量起的另外一个名字(别名),一般用“&”符号表示。起完别名后,这个别名与变量本身,我们就看成是同一个变量。
定义引用并不额外占用内存。或者也可以理解成,引用和原变量占用的是同一块内存。
以下行为会报错
int &refval2;//报错
int &refval3=3;//报错,引用需要绑定到变量上去;绑定到对象上也可以。但不能绑定到常量上去。
float &refval4=value;//不可以,类型要相同
区别于 int *p=&a; //注意&在等号的右边
引用的例子,当作形参传递到函数里面;函数运行结束,其可以被带出来
const表示不变的意思。
定义变量时,可以在前面增加const关键字,一 旦增加该关键字,该变量的值就不可以发生改变。
var的值到底是否可以修改?实际上可以修改,但强烈建议不要这样做,以免产生问题,既然承诺为const,就不要修改它的值
如何修改var值,看如下代码:
你在编译器,加断点调试的时候,看他俩的地址确实是一个东西;
但是如果你用cout打印出来,你会发现他两一个是17,一个是5
说明:引用,表面上看是一个东西;但实际上,系统会给别名新开辟一块内存(不用管)
c++才引用,也代表一个常量的概念,意思是在编译的时候求值,所以能够提升运行时的性能
那func1函数要怎样写呢?这里必须注 意,因为var2是常量,初始化时调用了func1函数,所以func1也得定义 成constexpr。
在书写func1函数时必须小心,其中的代码尽可能简单。而且,某些代码出现在func1函数中还会导致编译无法通过。
例如,在 func1函数中定义一个未初始化的变量就会导致编译出错,必须在定义的时候初始化。
如果常规调用,内部可以放for(int i=0;i<100;i++){cout<
如果 constexpr int var2=fun1()//报错
演示
然后运行下面代码
括号里面的代码其实是没有运行的
不难发现,尽管设置断点调试时,var和var2看起来值相等,但是上 面这个条件却不成立,这几乎可以肯定是编译器内部进行了一些特殊的处理。虽然在Visual Studio 2019中var和var2代表同一块内存(跟踪调试时观察到的),但应该只是假象,原变量(var)应该和别名(var2)处于不同的内存中。
常量的用途 比如 switch case