- 指针里面存的是某个变量的地址。
- 变量的引用就是一个变量的别名,变量和变量的引用代表着同一个变量。
- 紧跟在类型后面的&符号就是引用的声明符号,其他情况都可以认为是取地址符号。
- 引用不是一种独立的数据类型,引用只有声明,没有定义。必须先定义一个变量,之后对该变量建立一个引用,即声明该引用代表哪一个变量。
- 指针可以先声明,之后的任意时刻指向某个变量的地址。
- 声明一个引用后,不能再让其作为另一个不同类型变量的引用了。
- 不能建立引用数组。
- 可以建立引用的引用(C++新标准支持),也可以建立引用的指针。
- 引用其实就是一个指针常量,他的指向不能改变,只能指向一个指定的变量。所以,引用的本质还是指针,所有引用的功能都可以由指针实现。(C++之所以增加引用的机制,是为了方便用户,用户可以不必具体去处理地址,而把引用作为变量的“别名”来理解和使用,而把地址的细节隐藏起来,这样难度会小一些。)
- 用new申请一个类对象的时候,对象申请成功之后会默认调用其构造函数,而C语言中的malloc只是会申请空间,但是不会调用对象的构造函数。
验证2,3:
int a = 5; //语句1
cout << "语句1:" << a << endl;
int &b = a; //语句2
int c = a; //语句2
cout << "语句2:" << b << endl;
cout << "语句2:" << &b << endl;
cout << "语句2:" << c << endl;
cout << "语句2:" << &c << endl;
输出
语句1:5
语句2:5
语句2:0x28fe84
语句2:5
语句2:0x28fe80
总结:
int &b = a;
int c = a;
&b和c输出的结果完全一致,即:变量和变量的引用代表着同一个变量
验证4,6,9:
swap(a, c);
cout << "swap:" << "a = " << a << "c = " << c << endl;
swap(&a, &c);
cout << "swap:" << "a = " << a << "c = " << c << endl;
swap_(a, c);
cout << "swap:" << "a = " << a << "c = " << c << endl;
void swap(int *pa, int *pb) {
int t = *pa;
*pa = *pb;
*pb = t;
}
void swap_(int &a, int &b) {
int t = a;
a = b;
b = t;
}
void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
输出
swap:a = 5c = 10
swap:a = 10c = 5
swap:a = 5c = 10
总结:
- 4,6在编辑器中会提示错误。
2.根据输出结果,swap(a, c);无法调换a和c的值,而后面两个方法可以,这说明引用和指针意义相同,即证明9。
且swap(int &a, int &b)与swap(int a, int b)有重命名冲突,也说明&a与a其实都代表的变量,只是名称不同,即证明2。
验证:8,9
Student maqi = {"maqi", 1125, man, 18};
Student &newMaqi = maqi;
newMaqi.name = "maqi_1";
cout << newMaqi.name << "," << newMaqi.age << "," << newMaqi.num << "," << newMaqi.sex << endl;
string &name = newMaqi.name;
cout << "newMaqi:" << name << endl;
cout << "newMaqi:" << &name << endl;
cout << "=============================================="<< endl;
Student newMaqi_ = maqi;
newMaqi_.name = "maqi_2";
cout << newMaqi_.name << "," << newMaqi_.age << "," << newMaqi_.num << "," << newMaqi_.sex
<< endl;
string &name_ = newMaqi_.name;
cout << "newMaqi_:" << name_ << endl;
cout << "newMaqi_:" << &name_ << endl;
cout << "newMaqi:" << name << endl;
cout << "newMaqi:" << &name << endl;
cout << "=============================================="<< endl;
Student newMaqi__ = maqi;
newMaqi__.name = "maqi__2";
cout << newMaqi__.name << "," << newMaqi__.age << "," << newMaqi__.num << "," << newMaqi__.sex
<< endl;
string &name__ = newMaqi__.name;
cout << "newMaqi_:" << name_<< endl;
cout << "newMaqi_:" << &name_ << endl;
cout << "newMaqi__:" << name__ << endl;
cout << "newMaqi__:" << &name__ << endl;
cout << "newMaqi:" << name << endl;
cout << "newMaqi:" << &name << endl;
cout << "=============================================="<< endl;
Student *pNewMaqi = &maqi;
pNewMaqi->name = "maqi_3";
string &name_p = pNewMaqi->name;
cout << "pNewMaqi:" << name_p << endl;
cout << "pNewMaqi:" << &name_p << endl;
cout << "newMaqi:" << name << endl;
cout << "newMaqi:" << &name << endl;
输出:
maqi_1,18,1125,1
newMaqi:maqi_1
newMaqi:0x28fe54
==============================================
maqi_2,18,1125,1
newMaqi_:maqi_2
newMaqi_:0x28fe30
newMaqi:maqi_1
newMaqi:0x28fe54
==============================================
maqi__2,18,1125,1
newMaqi_:maqi_2
newMaqi_:0x28fe2c
newMaqi__:maqi__2
newMaqi__:0x28fe08
newMaqi:maqi_1
newMaqi:0x28fe50
==============================================
pNewMaqi:maqi_3
pNewMaqi:0x28fe54
newMaqi:maqi_3
newMaqi:0x28fe54
总结:
1.查看输出结果可知newMaqi/newMaqi__都为maqi的引用,且newMaqi/newMaqi__对name的修改都不会影响到maqi,说明是另外开辟的内存复制了maqi,而pNewMaqi的修改则会直接影响到maqi的name.,说明指针是直接操作当前内存的。
验证 10
void newAndDel() {
cout << "==============================================" << endl;
Maqi *pMaqi = (Maqi *) (malloc(sizeof(Maqi))); //C语言中使用 malloc 来申请一个Maqi 类型变量的内存
pMaqi->name = "malloc";
cout << "pMaqi->name = "<<pMaqi->name << endl;
free(pMaqi);
cout << "==============================================" << endl;
Maqi *pMaqi_ = new Maqi(); //C++ 中使用 new 来申请一个Maqi 类型变量的内存
pMaqi_->name = "new Maqi()";
cout << "pMaqi->name = "<<pMaqi_->name << endl;
//怎么样,看出 new 的优势了吧!
delete pMaqi_; //删除变量
cout << "==============================================" << endl;
Maqi *p = new Maqi[5]; //使用new申请一个包含5个Maqi 元素的数组
delete[] p; //删除数组
}
输出:
==============================================
pMaqi->name = malloc
==============================================
Maqi()
pMaqi->name = new Maqi()
~Maqi()
==============================================
Maqi()
Maqi()
Maqi()
Maqi()
Maqi()
~Maqi()
~Maqi()
~Maqi()
~Maqi()
~Maqi()
总结:
C++新增的new和delete明显比较方便,且调用了Maqi的构造和析构函数,这个和java就很像了,且malloc申请内存如果失败需要自行判断,比较麻烦。