我是一个使用C语言的人,我正在尝试理解一些C++代码。我有以下函数声明:
int foo(const string &myname) {
cout << "called foo for: " << myname << endl;
return 0;
}函数签名与等效的C:
int foo(const char *myname)使用string *myname和使用string &myname有什么区别吗?用来表示指针的C++中的&和C中的*有什么区别?
类似地:
const string &GetMethodName() { ... }&在这里做什么?有没有什么网站可以解释在C和C++中&的用法有什么不同?
发布于 2009-12-22 07:50:05
"&“表示引用,而不是指向对象的指针(在本例中是常量引用)。
具有如下函数的优点
foo(string const& myname) 结束
foo(string const* myname)在前一种情况下,您可以保证myname是非空的,因为C++不允许空引用。由于您是通过引用传递的,因此不会复制该对象,就像传递指针一样。
您的第二个示例:
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;
}基本上,你有责任确保你返回的任何引用都是有效的。
发布于 2009-12-22 07:26:15
在这里,&不用作运算符。作为函数或变量声明的一部分,&表示引用。C++常见问题精简版有一个非常漂亮的chapter on references。
发布于 2009-12-22 07:46:15
string *和string&有几个不同之处。首先,指针指向数据的地址位置。引用指向数据。如果您有以下函数:
int foo(string *param1);您必须检查函数声明,以确保param1指向有效的位置。相比较而言:
int foo(string ¶m1);在这里,调用者有责任确保指向的数据有效。你不能传递一个"NULL“值,例如,int上面的第二个函数。
关于你的第二个问题,关于方法返回值是一个引用,考虑以下三个函数:
string &foo();
string *foo();
string foo();在第一种情况下,您将返回对数据的引用。如果您的函数声明如下所示:
string &foo()
{
string localString = "Hello!";
return localString;
}您可能会得到一些编译器错误,因为您将返回对在该函数的堆栈中初始化的字符串的引用。在函数返回时,该数据位置不再有效。通常,您可能希望返回对类成员的引用或类似的内容。
上面的第二个函数返回实际内存中的指针,因此它将保持不变。不过,您必须检查空指针。
最后,在第三种情况下,返回的数据将被复制到调用者的返回值中。所以如果你的函数是这样的:
string foo()
{
string localString = "Hello!";
return localString;
}这样就没问题了,因为字符串"Hello“将被复制到该函数的返回值中,可在调用者的内存空间中访问。
https://stackoverflow.com/questions/1943276
复制相似问题