我是一个C人,我正在尝试理解一些C ++代码。我有以下功能声明:

int foo(const string &myname) {
  cout << "called foo for: " << myname << endl;
  return 0;
}

函数签名与等效c的不同有何不同

int foo(const char *myname)

使用之间有区别吗string *mynamevsstring &myname?有什么区别&在C ++和*在C指示指针?

相似地:

const string &GetMethodName() { ... }

是什么&在这里吗?是否有一些网站解释了如何&在C vs vs c ++中使用不同吗?

答案

“&“表示一个参考,而不是指向对象的指针(在您的情况下是常数引用)。

具有诸如函数之类的功能的优点

foo(string const& myname) 

超过

foo(string const* myname)

是在前一种情况下,您可以保证myName是非null的,因为C ++不允许null引用。由于您是通过引用传递的,因此不会复制对象,就像您通过指针一样。

您的第二个示例:

const string &GetMethodName() { ... }

将允许您返回恒定引用,例如,成员变量。如果您不希望返回副本,并且再次保证返回的值是非记录,这将很有用。例如,以下内容允许您直接,只读的访问:

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(); 
}

当然,您必须小心不要返回无效的参考。编译器将愉快地编译以下内容(取决于您的警告级别以及如何对待警告)

int const& foo() 
{
 int a;

 //This is very bad, returning reference to something on the stack. This will
 //crash at runtime.
 return a; 
}

基本上,您有责任确保您返回参考的任何内容实际上都是有效的。

来自: stackoverflow.com