What does '&' do in a C++ declaration?

前端 未结 7 1395
后悔当初
后悔当初 2020-11-28 03:40

I am a C guy and I\'m trying to understand some C++ code. I have the following function declaration:

int foo(const string &myname) {
  cout << \"ca         


        
7条回答
  •  佛祖请我去吃肉
    2020-11-28 04:47

    The "&" denotes a reference instead of a pointer to an object (In your case a constant reference).

    The advantage of having a function such as

    foo(string const& myname) 
    

    over

    foo(string const* myname)
    

    is that in the former case you are guaranteed that myname is non-null, since C++ does not allow NULL references. Since you are passing by reference, the object is not copied, just like if you were passing a pointer.

    Your second example:

    const string &GetMethodName() { ... }
    

    Would allow you to return a constant reference to, for example, a member variable. This is useful if you do not wish a copy to be returned, and again be guaranteed that the value returned is non-null. As an example, the following allows you direct, read-only access:

    class A
    {
      public:
      int bar() const {return someValue;}
      //Big, expensive to copy class
    }
    
    class B
    {
    public:
     A const& getA() { return mA;}
    private:
     A mA;
    }
    void someFunction()
    {
     B b = B();
     //Access A, ability to call const functions on A
     //No need to check for null, since reference is guaranteed to be valid.
     int value = b.getA().bar(); 
    }
    

    You have to of course be careful to not return invalid references. Compilers will happily compile the following (depending on your warning level and how you treat warnings)

    int const& foo() 
    {
     int a;
    
     //This is very bad, returning reference to something on the stack. This will
     //crash at runtime.
     return a; 
    }
    

    Basically, it is your responsibility to ensure that whatever you are returning a reference to is actually valid.

提交回复
热议问题