混淆C++的引用和函数

混淆C++的引用和函数,c++,C++,如果我有一个函数引用 string& Basic_Functions::printval(std::string &str){ return str; } 然后我把它叫到主楼 string sample = "This is a sample"; cout << sample<< endl; 在我看来 string i2 = printval2(sample) = "hehe"; cout << i2 << end

如果我有一个函数引用

string& Basic_Functions::printval(std::string &str){
  return str;
}
然后我把它叫到主楼

 string  sample = "This is a sample";
 cout << sample<< endl;
在我看来

string i2 = printval2(sample) = "hehe"; 

cout << i2 << endl;

string i3 = printval3(sample) = "huhuh";
cout << i3 << endl;
但是如果你说

string i3 = printval(sample) = "huhuh"; //?

我在这里指的是什么?printval绑定到什么?

好的,有一大堆问题。从顶部开始:

string& Basic_Functions::printval(std::string& str) {
    return str;
}
这不是一个函数引用,它是一个函数的定义,它引用std::string并返回对string的引用。我假设您指的是std::string,而不是自定义类?。此函数将返回传递给它的std::string的相同实例,例如

std::string s1 = "Sample string";
std::string s2 = Basic_Functions::printval(s1); // Equal to "std::string s2 = s1";
下一步:

由于printval2按值返回,这等于:

string i2 = (string(sample) = "hehe");
这将创建一个临时using sample,并将hehe分配给它,然后它将使用临时值初始化i2。这确实是不必要的工作,因为使用简单的字符串i2=hehe可以获得相同的效果

第三个变量printval3引入了未定义的行为,因为它通过引用返回局部变量

string& Basic_Functions::printval3(std::string str) { // Argument is copy constructed.
    return str; // Returning a reference to something that will soon be destructed.
} // All local variables are destructed here.
例如

这等于

string i3 = (sample = "huhuh");
printval返回对sample的引用,然后使用huhuh将其分配给,最后使用sample初始化i3。这基本上与我们所做的相同

sample = "huhuh";
string i3 = sample;

这是非常糟糕的格式。请修复。如果我有函数引用-那不是函数引用。在main上调用它-你没有调用它。我试着修改函数-你没有修改它。您创建了两个新的。总之,请回到您的书中。@Tifa在第一个示例中,您不调用函数。你只需打印出字符串本身,就好像你可以阅读一本基本的C++书籍。这个网站上已经有一个很好的参考资料了。
string i2 = (string(sample) = "hehe");
string& Basic_Functions::printval3(std::string str) { // Argument is copy constructed.
    return str; // Returning a reference to something that will soon be destructed.
} // All local variables are destructed here.
const std::string& sref = printval3(sample); // Store reference.
cout << sref << endl;                        // UB! sref points to deallocated data.
string i3 = printval(sample) = "huhuh"; //?
string i3 = (sample = "huhuh");
sample = "huhuh";
string i3 = sample;