84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
闭关修行中......
C++里引用其实只是受限的指针,只是在语义上限制不能对引用这一受限的指针做一些指针能做的操作:重新赋值,拷贝,++,--(暂时还没有想到其他的),并限制不允许为空,以提高安全性,可以理解为是编译器对指针的一种保护模式。
那么,考虑什么时候应该使用引用,又什么时候应该使用指针呢?我认为有几点:
引用优先
凡是能用引用代替指针的都用引用。
指针是允许为空的,而引用不允许。
const stock* top(...) { return NULL; }
当然,这种情况下你还是可以坚持使用引用,然后空对象的情况下可以通过throw exception的方式来表达:
const stock& top(...) { throw null_top_stock_exception(); }
合理使用语义暗示,指针暗示拥有(has),引用暗示关联(use):
car has a wheelcar has a wheel
car
wheel
class wheel {}; class car { wheel* _wheel; public: car() : _wheel(NULL) {}; void set_wheel(wheel* wheel) { _wheel = wheel; }; };
trip use a car
trip
class trip { const car& _car public: trip(const car& car) : _car(car) {}; };
class trip { const car* _car public: trip(const car* car) : _car(car) {}; void set_car(const car* car) : _car(car) { _car = car; }; };
std::vector<car> cars; // OK std::vector<car*> cars; // OK std::vector<car&> cars; // ERROR
class maintainer { public: void maintain(car& car) { car* p = &car; // play with pointer 'p' } };
class maintainer { car* _last_car; public: void maintain(car& car) { car* _last_car = &car; // ... } void review_last_maintain() { // play with "_last_car" } };
rrreee
const讲起来就是个无底洞举个引用的例子吧
#include <iostream> #include<string> using namespace std; class Stu { public: Stu(string name, int age) // :name(name),age(age) { this->name = name; this->age = age; } Stu & Add() //Stu * const & Add() { this->age++; return *this; // return this;//this 指针是const类型 } void display() { cout << name << " : " << age << endl; } private: string name; int age; }; int main() { Stu s("xiaoming", 20); s.display(); s.Add().Add().Add().Add().Add(); //Add函数返回引用的好处是,你可以进行连加或者比如运算符重载返回引用类型进行连等于运算 //s.Add()->Add()->Add()->Add(); s.display(); return 0; }
指针的话,允许return NULL,引用的话不行。
C++里引用其实只是受限的指针,只是在语义上限制不能对引用这一受限的指针做一些指针能做的操作:重新赋值,拷贝,++,--(暂时还没有想到其他的),并限制不允许为空,以提高安全性,可以理解为是编译器对指针的一种保护模式。
那么,考虑什么时候应该使用引用,又什么时候应该使用指针呢?我认为有几点:
引用优先
指针是允许为空的,而引用不允许。
当然,这种情况下你还是可以坚持使用引用,然后空对象的情况下可以通过throw exception的方式来表达:
合理使用语义暗示,指针暗示拥有(has),引用暗示关联(use):
car
has awheel
car
has awheel
trip
use acar
trip
use acar
:rrreee
在退出maintain方法后,_last_car指向的对象是很有可能会被释放的哦。const讲起来就是个无底洞
举个引用的例子吧
指针的话,允许return NULL,引用的话不行。