第二章 基本语言
第三节 auto、头文件防卫、引用、常量
1. 局部变量及初始化
- 随时用到,随时定义
#include <iostream>
int main() {
// i的作用域仅仅限制 在for循环内
for (int i = 0; i < 10; i++) {
std::cout << "i = " << i << std::endl;
}
return 0;
}
- 定义的时候初始化
#include <iostream>
int main() {
// int abc = {5},等号在这里可有可无
int abc{5};
std::cout << "abc = " << abc << std::endl;
for (int i{0}; i < 5; i++) {
std::cout << "i = " << i << std::endl;
}
// 可以使用等号,也可以不进行使用
int a[]{11, 10, 9};
for (int i{0}; i < (sizeof(a) / sizeof(int)); i++) {
std::cout << "i = " << i << std::endl;
}
// int abcd=3.5f; // 丢了.5,被系统截断了
// 无法编译成功,系统执行了浮点数到整数的转换
// int abcd{3.5f};
return 0;
}
2. auto
-
变量的自动类型推断,auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型
(声明时要初始化) -
auto自动类型推断发生在编译期间,使用auto不会造成程序执行效率降低
#include <iostream>
int main() {
auto bvalue = true;
auto ch = 'a';
auto dv = 1.2f;
auto iv = 5;
return 0;
}
3. 头文件防卫
- 头文件互相包含会出现重定义的问题
//
// Created by felaim on 2020/5/12.
//
#ifndef LESSION_PART_TWO_PRO1_H
#define LESSION_PART_TWO_PRO1_H
namespace B {
void radius();
void radius2();
}
#endif //LESSION_PART_TWO_PRO1_H
4. 引用
- 为变量起了另外一个名字,一般用&符号表示,起完别名后,这别名和变量本身可以看成是一个变量
#include <iostream>
using namespace std;
//形参是引用类型
void func(int &ta, int &tb) {
ta = 4; //改变这个值会影响到外界
tb = 5;
}
int main() {
int value = 10;
//value的别名就是value1, &在这里不是求地址运算符,只是起标识作用
// 定义引用,并不额外占用内存
// 定义引用的时候必须得初始化,不然给谁起别名呢?
int &value1 = value;
cout << value << endl;
cout << value1 << endl;
//引用必须要绑定到变量上去,绑定到对象上去也可以,不能绑定到常量上去
// int &value3 = 10;
// 不可以,引用类型要相同
// float &value3 = value;
int a = 3;
// int &b = a;//引用, 注意&符号在=的左边
// int *p = &a;//取地址符, 注意&符号在=的右边
int b = 100;
func(a, b);
cout << "a: " << a << " b: " << b << endl;
return 0;
}
5. 常量
-
不变的量
-
const: 表示不变的意思
#include <iostream>
using namespace std;
int main() {
// 表示这个变量的值不会去改变,命名常量
const int var = 7;
cout << "var: " << var << endl;
// 如果修改成10, 编译时报错error: assignment of read-only variable ‘var’
// var = 10;
// 强制转换,不要这么做,容易出错
int &var2 = (int &)var;
var2 = 88;
cout << "var: " << var << endl; // 7
cout << "var2: " << var2 << endl; // 88
return 0;
}
- constexpr 关键字: c++11引入的, 也是常量的概念, 在编译的时候求值,肯定能够提升性能
(感觉这段课程讲的有些问题,下面这段代码在c++11中是不支持的,但是到c++14, c++17就支持了,可能这个对各个标准支持还是不太一样的)
参考地址:https://stackoverflow.com/questions/45097171/the-body-of-constexpr-function-not-a-return-statement
#include <iostream>
using namespace std;
constexpr int func(int abc) {
abc = 8;
return 5;
}
int main() {
constexpr int var = 1;
int b = 5;
constexpr int var2 = func(11);
return 0;
}