写在前面
我们经常使用 #ifndef,#define,#endif 来防止头文件的内容被重复包含
#pragma once 可以防止整个文件的内容被重复包含
区别
#ifndef,#define,#endif 受 C\C++ 标准的支持, 不受编译器的任何限制
有些编译器不支持 #pragma once(较老编译器不支持, 如 GCC 3.4 版本之前), 兼容性不够好
#ifndef,#define,#endif 可以针对一个文件中的部分代码, 而 #pragma once 只能针对整个文件
名词解释
在 C 语言中, 使用指针 (Pointer) 可以间接获取, 修改某个变量的值
在 C++ 中, 使用引用 (Reference) 可以起到跟指针类似的功能
注意点
引用相当于是变量的别名(基本数据类型, 枚举, 结构体, 类, 指针, 数组等, 都可以有引用) 对引用做计算, 就是对引用所指向的变量做计算
在定义的时候就必须初始化, 一旦指向了某个变量, 就不可以再改变,"从一而终"
可以利用引用初始化另一个引用, 相当于某个变量的多个别名 不存在[引用的引用, 指向引用的指针, 引用数组]
引用存在的价值之一: 比指针更安全, 函数返回值可以被赋值
接下来我们再来 const-- 下一讲会专门来讲 字段(iOS 开发者不会陌生), 常引用, 数组的引用, 表达式的引用
常引用 const
将 main.m 改为 mian.mm 文件(以后若是同样的操作, 将不再赘述)
const 是常量的意思, 被其修饰的变量不可修改
如果修饰的是类, 结构体(的指针), 其成员也不可以更改
引用可以被 const 修饰, 这样就无法通过引用修改数据了, 可以称为常引用
const 必须写在 & 符号的左边, 才能算是常引用
const 引用的特点 可以指向临时数据(常量, 表达式, 函数返回值等)
可以指向不同类型的数据
作为函数参数时(此规则也适用于 const 指针)
可以接受 const 和非 const 实参(非 const 引用, 只能接受非 const 实参)
可以跟非 const 引用构成重载
当常引用指向了不同类型的数据时, 会产生临时变量, 即引用指向的并不是初始化时的那个变量
- int a = 20;
- int &page = age;
其中 page 就是一个引用
const 也是老生常谈的问题
- int a = 20;
- const int *page = age;
page 被 const 修饰, 则 page 不可改变了, 就是固定的值了
- int a = 10;
- int *p = &a;
- *p = 30;
- cout << a << endl;
打印结果:
30
数组引用
- int array[] = {
- 10, 20, 30
- };
- int (&rArray)[3] = array;
- cout << array << endl;
- cout << &rArray << endl;
打印结果
- 0x7ffeefbff54c
- 0x7ffeefbff54c
在函数调用, 需要传入数组参数时, 就可以传入引用
- void testArray(int (&array)[3])
- {
- cout << "size:" << sizeof(array) << endl;
- for (int i = 0; i < sizeof(array)/4; i++)
- {
- cout << array[i] << endl;
- }
- }
- //sizeof 计算对象的大小 是字节为单位的, sizeof(array)/4 就是有多小个 int 数据
- int array[] = { 10, 20, 30 };
- testArray(array);
打印结果:
- size:12
- 10
- 20
- 30
再举几个(枚举, 结构体)
- enum Season {
- Spring,
- Summer,
- Fall,
- Winter
- };
- struct Student {
- int age;
- };
- Season season;
- Season &rSeason = season;
- rSeason = Winter;
- cout << season << endl;
- Student stu;
- Student &rStu = stu;
- rStu.age = 20;
- cout << stu.age << endl;
看下打印结果:
3
20
装逼一下
引用的本质
引用的本质就是指针, 只是编译器削弱了它的功能, 所以引用就是弱化了的指针
一个引用占用一个指针的大小
来源: https://juejin.im/post/5c541aeae51d450161731d63