搜尋

首頁  >  問答  >  主體

c++中类对象作为参数都是值拷贝吗?

c++中string作为参数是值拷贝,其他的对象也都是这样的么?

天蓬老师天蓬老师2816 天前433

全部回覆(5)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:35:17

    c++中string當參數是值拷貝?

    是。

    其他的物件也都是這樣的麼?

    不一定,看拷貝/移動建構函數的定義是什麼樣的。例如:Value-like class 和 Pointer-like class。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:35:17

    題主既然都知道觀察彙編視窗那麼很容易就會發覺那裡呼叫了該物件的拷貝的建構函數,所以這裡是by value

    實際上c++的物件都是作為by value的,如果需要by reference那你需要將函式簽章改為const string& obj

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 13:35:17

    1.若是將物件作為值參數傳入函數,例如func(const string obj),將會對物件進行拷貝複製,產生臨時對象,影響效能;
    2.若是將物件作為引用或指針傳入參數,例如func(const string &obj),fun(const string *obj),不會物件進行拷貝和複製,不會產生臨時物件。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:35:17

    因為你傳遞參數的方式是按值傳遞的,所以呼叫的是拷貝建構函數,可以換成 string &x;這樣就是傳遞引用了。另外c++11中新增加了可以用 string && x傳遞臨時變數

    回覆
    0
  • PHP中文网

    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.

    回覆
    0
  • 取消回覆