首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >'&‘在C++声明中做什么?

'&‘在C++声明中做什么?
EN

Stack Overflow用户
提问于 2009-12-22 07:22:20
回答 7查看 159.6K关注 0票数 71

我是一个使用C语言的人,我正在尝试理解一些C++代码。我有以下函数声明:

代码语言:javascript
复制
int foo(const string &myname) {
  cout << "called foo for: " << myname << endl;
  return 0;
}

函数签名与等效的C:

代码语言:javascript
复制
int foo(const char *myname)

使用string *myname和使用string &myname有什么区别吗?用来表示指针的C++中的&和C中的*有什么区别?

类似地:

代码语言:javascript
复制
const string &GetMethodName() { ... }

&在这里做什么?有没有什么网站可以解释在C和C++中&的用法有什么不同?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-12-22 07:50:05

"&“表示引用,而不是指向对象的指针(在本例中是常量引用)。

具有如下函数的优点

代码语言:javascript
复制
foo(string const& myname) 

结束

代码语言:javascript
复制
foo(string const* myname)

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

您的第二个示例:

代码语言:javascript
复制
const string &GetMethodName() { ... }

将允许您返回对成员变量的常量引用。如果您不希望返回副本,并且再次保证返回的值不为空,则这一点很有用。例如,以下代码允许您直接进行只读访问:

代码语言:javascript
复制
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(); 
}

当然,你必须小心不要返回无效的引用。编译器将很乐意编译以下代码(取决于您的警告级别和处理警告的方式)

代码语言:javascript
复制
int const& foo() 
{
 int a;

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

基本上,你有责任确保你返回的任何引用都是有效的。

票数 58
EN

Stack Overflow用户

发布于 2009-12-22 07:26:15

在这里,&不用作运算符。作为函数或变量声明的一部分,&表示引用。C++常见问题精简版有一个非常漂亮的chapter on references

票数 23
EN

Stack Overflow用户

发布于 2009-12-22 07:46:15

string *和string&有几个不同之处。首先,指针指向数据的地址位置。引用指向数据。如果您有以下函数:

代码语言:javascript
复制
int foo(string *param1);

您必须检查函数声明,以确保param1指向有效的位置。相比较而言:

代码语言:javascript
复制
int foo(string &param1);

在这里,调用者有责任确保指向的数据有效。你不能传递一个"NULL“值,例如,int上面的第二个函数。

关于你的第二个问题,关于方法返回值是一个引用,考虑以下三个函数:

代码语言:javascript
复制
string &foo();
string *foo();
string foo();

在第一种情况下,您将返回对数据的引用。如果您的函数声明如下所示:

代码语言:javascript
复制
string &foo()
{
    string localString = "Hello!";
    return localString;
}

您可能会得到一些编译器错误,因为您将返回对在该函数的堆栈中初始化的字符串的引用。在函数返回时,该数据位置不再有效。通常,您可能希望返回对类成员的引用或类似的内容。

上面的第二个函数返回实际内存中的指针,因此它将保持不变。不过,您必须检查空指针。

最后,在第三种情况下,返回的数据将被复制到调用者的返回值中。所以如果你的函数是这样的:

代码语言:javascript
复制
string foo()
{
    string localString = "Hello!";
    return localString;
}

这样就没问题了,因为字符串"Hello“将被复制到该函数的返回值中,可在调用者的内存空间中访问。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1943276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档