由于您刚从 Java 中走出来,我可以想象您遇到了很多 C/C++ 允许您做的危险事情的问题。在我看来,区别就在这里:
- C/C++ 可以让你做很多强大的和危险的的东西。你可以做很多伟大的事情,但也可以在自己的腿上开枪
- Java 限制以安全的名义可以做的事情
你不喜欢的(“指针/引用是危险的”)正是我喜欢的(“它让我可以做很多事情,如果我搞砸了,那是我的错”)关于 C++。在我看来,这是编程语言品味的问题。
引用是为了避免指针的一些危险,但另一方面,除了明显的快速访问之外,即使是指针也有用途。例如,假设您有一个低级对象,它做了一些有用的工作,并在多个高级对象之间共享。可以出于各种原因共享它(例如,它每次执行有用的工作时都会更新内部状态,因此复制它不是一种选择)。
class HL{
private:
LL &object;
public:
HL(LL &obj){
object = obj; // initialization of reference
}
// a no-argument constructor is not possible because you HAVE to
// initialize the reference at object-creation (or you could initialize
// it to a dummy static object of type LL, but that's a mess)
void some_routine(){
....
object.useful_work();
...
}
}
在这种情况下使用引用强制内部object的初始化。另一方面,如果对象提供的功能对于高级对象来说只是可选,那么指针就是一种方法:
class HL{
private:
LL *object;
public:
HL(LL &obj){
object = &obj; // initialization of reference
}
HL(){} // no-argument constructor possible
void some_routine(){
....
if (object != NULL)
object->useful_work();
...
}
}
此外,对于引用调用的使用,当您将大结构传递给函数时,这是最有用的,例如vector<int>.
void function(vector <int> a); // call by value, vector copied every time
void function(vector <int> &a); // call by reference, you can modify
// the vector in the function
void function(const vector <int> &a); // if you don't want to be able to modify
// it, you can add const for "protection"