C++复杂的原因:提供了太多的内存模型.
- 太多可以放对象的地方(堆、堆栈、全局数据区里面)
- 提供了太多访问对象的方式 (变量里面放对象,通过指针访问一个对象,通过引用去访问一个对象)
以上有九种组合.
char c;
char* p = &c;
char& r = c; //引用 初始化
//引用:一般的时候需要定义的时候给这个初始化. r是c的引用(别名). 初始值必须是一个变量或可以做左值的东西.
//需要用c的时候,可以用r. 用r就是在用c. 一个东西的两个名字.
type& refname = name;
int X = 47;
int& Y = X; //Y是X的别名.
cout << "Y = " << y << endl; //Y = 47
Y = 18;
cout << "X = " << x << endl; //X = 18
reference的规则
- 定义的时候必须要初始化
int x = 3; //引用定义的时候,必须初始化.
int& y = x; //引用y x绑在一起
const int& z = x; //z是x的别名, 可以该x值, 但不能改变z. 因为const
///
void f(int& x);
f(y);
int* f(int* x)
{
(*x)++;
return x; //safe, x is outside this scope.
}
int& g(int& x) //引用
{
x++;
return x;//safe, outside this scope
}
int x;
int& h()
{
int q;
//return q; //wrong
return x; //ok
}
int main()
{
int a = 0;
f(&a); //a=1
g(a); //x = 2
h() = 16; h()返回结果是引用,既然是引用就可以做左值.
return 0;
}
Pointer vs Reference
Reference: 不能是NULL,必须有初始值
Point:可以是NULL
Reference: 必须依赖于存在的变量, 是别名
Point:独立的
Reference: 通过const指针实现(为了代码少一些*)
Point:
int&* p; //wrong
void f(int* &p); //ok