我是一个C人,我正在尝试理解一些C ++代码。我有以下功能声明:
int foo(const string &myname) {
cout << "called foo for: " << myname << endl;
return 0;
}
函数签名与等效c的不同有何不同
int foo(const char *myname)
使用之间有区别吗string *myname
vsstring &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;
}
基本上,您有责任确保您返回参考的任何内容实际上都是有效的。