伊谢尔伦2017-04-17 13:35:17
c++中string當參數是值拷貝?
是。
其他的物件也都是這樣的麼?
不一定,看拷貝/移動建構函數的定義是什麼樣的。例如:Value-like class 和 Pointer-like class。
巴扎黑2017-04-17 13:35:17
題主既然都知道觀察彙編視窗那麼很容易就會發覺那裡呼叫了該物件的拷貝的建構函數,所以這裡是by value
實際上c++的物件都是作為by value的,如果需要by reference那你需要將函式簽章改為const string& obj
怪我咯2017-04-17 13:35:17
1.若是將物件作為值參數傳入函數,例如func(const string obj),將會對物件進行拷貝複製,產生臨時對象,影響效能;
2.若是將物件作為引用或指針傳入參數,例如func(const string &obj),fun(const string *obj),不會物件進行拷貝和複製,不會產生臨時物件。
巴扎黑2017-04-17 13:35:17
因為你傳遞參數的方式是按值傳遞的,所以呼叫的是拷貝建構函數,可以換成 string &x;這樣就是傳遞引用了。另外c++11中新增加了可以用 string && x傳遞臨時變數
PHP中文网2017-04-17 13:35:17
C++中參數的傳遞方式是值拷貝(by value)還是引用拷貝(by reference)取決於你的形參命名方式。
範例一:按值傳遞。
/* function declaration of transferring argument by value */
void func(string s) {
// operates on string object s
// note that here s is a copy of the string object you transferred in so any function-scope change will not affect invoker environment.
}
/* example usage of aforementioned function */
string str;
func(str);
// after func call, str will keep the same
範例二:按引用傳遞。
/* function declaration */
void func(string& s) {
// operate on string object s
// local change will be applied to the argument you transferred in
}
/* example usage */
string str;
func(str);
// at this time, str will be changed with the modification func() made to it
範例三:以常數引用傳遞(在實際的工作中,這種呼叫方式是最常被使用的,它可以有效減少string拷貝的記憶體和CPU時間消耗)。
/* function declaration */
void func(const string& s) {
// transfer in a read-only reference of string object s
// no copy will be made against s, neither any change allowed upon it
}
/* example usage */
string str;
func(str);
// str is not supposed to be changed after func() invoke.