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
3
char c;
char* p = &c; // 指针
char& r = c; // 引用
引用需要在定义的时候做初始化,其初始值必须是一个变量。引用也被称为别名,表示被引用目标除了本身的名字name之外,还拥有引用的别名refname
1
type& refname = name;
在参数表或者成员变量中可以不用给出初始值。

1
2
3
4
5
6
int x = 47;
int& y =x; //y是x的引用;
cout << "Y = "<< y << endl;//y的值是47
y = 18;
cout << "X=" << x << endl;
//结果:X=18

引用的目标必须是一个实际名字的内容:

1
2
void func(int &);
func(i*3); // error

引用和指针

引用 指针
不能为空 可以为空
与已经存在的一个变量相关联,是这个变量的别名 独立于任何存在的对象
不能改变引用的对象 可以改变指向的对象

使用引用的规则

  • 不能引用一个引用
  • 不能指向一个引用(但是可以引用一个指针)
    1
    2
    int &*p; //illegal
    void f (int*&p); // ok
  • 没有引用的数组(因为引用不是一个实体)

向上造型

如果类D是类B的子类,那么:D的指针可以交给B的指针,D的引用可以交给B的引用。D中的对象可以被当做父类B的对象看待。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
class A{
public:
int i;
public:
A():i(10) {}
};

class B: public A{

};

int main(){
A a;
B b;
cout <<a.i<<' '<<b.i<< endl;
cout <<sizeof(a)<<' '<<sizeof(b)<< endl;
int *p = (int*)&a; //取a的地址
cout << p <<" "<< *p<< endl;
p = (int*)&b;//取b的地址
cout << p <<" "<< *p<< endl;

return 0;
};
1
2
3
4
>> 10 10
4 4
0x7fff56789bf0 10
0x7fff56789be8 10

可以发现ab的大小相同,地址不同。
现在更改*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
把子类的对象当做为父类的对象看待的行为为向上造型(upcast)。


7. 引用·向上造型
https://l61012345.top/2024/01/28/学习笔记/C++面向对象设计/7. 引用和向上造型/
作者
Oreki Kigiha
发布于
2024年1月28日
更新于
2024年2月6日
许可协议