繁体   English   中英

const char&作为函数的参数

[英]const char& as an argument to a function

我需要对以下代码块进行一些说明。 我正在研究类似的编码,我想了解它是如何工作的。 Google上没有太多提及,而且我发现的唯一提及对我来说太技术性了。

  1. 在以下代码中,线程和非线程函数具有不同的输出。 这是为什么?

     #include <boost/thread.hpp> #include <iostream> #include <stdio.h> using namespace std; void fTry1(const char&); void fTry2(const char&); int main() { boost::thread tTry1, tTry2; const char *a = "efgh"; tTry1 = boost::thread(fTry1, *a); fTry2(*a); tTry1.join(); return 0; } void fTry1(const char& a) { cout << "Thread" << endl; cout << &a << endl; } void fTry2(const char& a) { cout << "Non-thread" << endl; cout << &a << endl; } 

样本输出:

Non-thread
efgh
Thread
e<garbage data>
  1. 如果我更改以下行

     cout << &a << endl; 

     cout << a << endl; 

输出变为类似

Non-thread
e
Thread
e

同样,为什么呢?

-

我正在处理的代码使用数字2,但是传递的字符串是文件夹的路径,因此我需要整个字符串,而不仅仅是第一个字符。 但是由于我不了解它是如何工作的,因此我将无法轻易对其进行更改。

默认情况下,传递给boost::thread的参数将被value “捕获”。 要通过reference捕获它们,必须使用boost::ref ;

tTry1 = boost::thread(fTry1, boost::ref(*a));

例如,这非常类似于lambda函数:

const char *a = "efgh";
const char &c = *a;

auto garbage = [c]() { // c captured by value
   cout << &c << endl;
};

auto works = [&c]() { // c captured by ref
    cout << &c;
};

garbage();
works();

注意:

请小心将referencespointers传递给新线程,因为您需要确保在新线程正在使用它们时它们保持有效。 但是,在您的独特情况下,这并不适用,因为字符串文字efgh具有static duration因此无论哪种方式都是安全的。

const char *a = "efgh";的字符串文字const char *a = "efgh"; 使用隐藏的终止符'\\0'编译。

当您像*a一样传递它时,您将取消引用它。 您基本上只传递了一个字符。 这对于非线程函数来说还可以,因为如果您使用&a来获取字符a的地址(使其成为c字符串),它仍将指向包含终止符的字符串文字"efgh" cout将继续打印,直到碰到终止符。

但是,我怀疑,当您将*a传递给boost::thread它实际上是在复制字符,而只是复制字符,而不是整个字符串。 当您稍后使用&a将其重新转换为c样式的字符串时&a不再有终结符,因此cout会不断地继续打印,您会看到垃圾。

当您更改cout << &a << endl; cout << a << endl; 您告诉cout您只有wnat才能打印1个字符。 因此它只会打印1。

您用c++标记了问题,为什么不使用std::string呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM