簡體   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