7. 引用·向上造型
本文最后更新于 2024年2月6日 晚上
引用·向上造型
这是浙江大学翁恺老师的公开课,《面向对象设计C++》
视频地址:
https://www.bilibili.com/video/BV1yQ4y1A7ts/?spm_id_from=333.337.search-card.all.click&vd_source=3074f6f6ab43a114c5af8727fa4f7255
本节对应视频21-22部分。
引用
C++中提供了多种对象的存储方式:对象可以在堆栈、堆和全局数据区中;它也提供了多种访问对象的方式:对象可以通过直接掌握(变量中是对象)、指针、引用的方式被访问。
引用是一种C++中的数据类型。
1
2
3char c;
char* p = &c; // 指针
char& r = c; // 引用name
之外,还拥有引用的别名refname
。
1
type& refname = name;
1 |
|
引用的目标必须是一个实际名字的内容:
1
2void func(int &);
func(i*3); // error
引用和指针
引用 | 指针 |
---|---|
不能为空 | 可以为空 |
与已经存在的一个变量相关联,是这个变量的别名 | 独立于任何存在的对象 |
不能改变引用的对象 | 可以改变指向的对象 |
使用引用的规则
- 不能引用一个引用
- 不能指向一个引用(但是可以引用一个指针)
1
2int &*p; //illegal
void f (int*&p); // ok - 没有引用的数组(因为引用不是一个实体)
向上造型
如果类D
是类B
的子类,那么:D
的指针可以交给B
的指针,D
的引用可以交给B
的引用。D
中的对象可以被当做父类B
的对象看待。
1 |
|
1 |
|
可以发现a
和b
的大小相同,地址不同。
现在更改*P
的值:
1
2
3
4
5
6
7
8···
int *p = (int*)&a; //取a的地址
cout << p <<" "<< *p<< endl;
*p=20;
cout << a.i<<endl;
p = (int*)&b;//取b的地址
cout << p <<" "<< *p<< endl;
···1
2
3
4
5>> 10 10
4 4
0x7fff56789bf0 10
20
0x7fff56789be8 10