亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4497 | 回復(fù): 15
打印 上一主題 下一主題

[C++] 成員函數(shù)返回對象還是引用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-11-05 16:24 |只看該作者 |倒序?yàn)g覽
本帖最后由 andy_hqj 于 2013-11-05 17:51 編輯

首先附上代碼
1、str.h
class String
{
        char * data;

public:
        String(char * str);
        String(String &s);
        ~String();
        String & operator=(String &s);
        String operator+(String &s);
};

2、str.cpp
#include <iostream>
#include "str.h"
#include <string.h>
using namespace std;

String::String(char *str)
{
        data=new char[strlen(str)+1];
        strcpy(data, str);
}

String::String(String &s)
{
        data=new char[strlen(s.data)+1];
        strcpy(data, s.data);
}
String::~String()
{
        delete [] data;
}
String & String:: operator=(String &s)
{
        if(this == &s)
                return *this;
        delete [] this->data;
        this->data = new char[strlen(s.data)+1];
        strcpy(this->data,s.data);
        return *this;
}
String String:: operator+(String &s)
{
        String tmp( "" );
        delete [] tmp.data ;
        tmp.data = new char[strlen(data)+strlen(s.data)+1];
        strcpy(tmp.data, data);
        strcat(tmp.data, s.data);
        return tmp;
}


3、測試函數(shù) main.cpp
#include <iostream>
#include "str.h"
using namespace std;
int main()
{
        String s("hello" );
        String s1("world" );

        String s3("" );
        s3 = s + s1;
        return 0;
}


錯誤:
1、String s3("" );
        s3 = s + s1;
編譯錯誤為:
main.cpp: In function ‘int main()’:
main.cpp:10: 錯誤:no match 為 ‘operator=’ 在 ‘s3 = String:: operator+(String& ) (((String& ) (& s1)))’ 中
str.h:9: 附注:備選為: String& String:: operator=(String& )
2、如果寫成 String s3=s+s1;
編譯錯誤為:
main.cpp:9: 錯誤:對 ‘String::String(String)’ 的調(diào)用沒有匹配的函數(shù)
str.h:7: 附注:備選為: String::String(String& )
str.h:6: 附注:         String::String(char*)


但如果把重載+法運(yùn)算符號的返回值改為引用,這兩種方法都沒問題(當(dāng)然會提示返回局部變量地址)

那位幫忙解釋一下,這兩個錯誤的原因,我的環(huán)境為as5 gcc

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [報告]
發(fā)表于 2013-11-06 08:21 |只看該作者
一個 const修飾 也沒有

論壇徽章:
59
2015年亞洲杯之約旦
日期:2015-01-27 21:27:392015年亞洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵節(jié)徽章
日期:2015-03-06 15:50:392015年亞洲杯之阿聯(lián)酋
日期:2015-03-19 17:39:302015年亞洲杯之中國
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03雙子座
日期:2014-12-10 21:39:16處女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [報告]
發(fā)表于 2013-11-06 08:31 |只看該作者
回復(fù) 2# bruceteen


    **好, 我沒看出什么錯誤, **看出來沒?
難道
operator+

const CLASS:perator+
才行?

好像沒什么道理啊。

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [報告]
發(fā)表于 2013-11-06 08:33 |只看該作者
folklore 發(fā)表于 2013-11-06 08:31
回復(fù) 2# bruceteen

s+s1 是個臨時String,不能被作為 String & operator=(String &s) 的參數(shù),除非參數(shù)改為 const String& s
  1. class String
  2. {
  3. public:
  4.     String( const char* str );
  5.     String( const String& s );
  6.     ~String();
  7.     String& operator=( const String& s );
  8.     String operator+( const String& s ) const;
  9. private:
  10.     char* data_;
  11. };

  12. #include <cstring>

  13. String::String( const char* str )
  14. {
  15.     data_ = new char[strlen(str)+1];
  16.     strcpy( data_, str );
  17. }

  18. String::String( const String& s )
  19. {
  20.     data_ = new char[strlen(s.data_)+1];
  21.     strcpy( data_, s.data_ );
  22. }
  23. String::~String()
  24. {
  25.     delete[] data_;
  26. }
  27. String& String::operator=( const String& s )
  28. {
  29.     if( this == &s )
  30.         return *this;
  31.     delete[] data_;
  32.     data_ = new char[strlen(s.data_)+1];
  33.     strcpy( data_, s.data_ );
  34.     return *this;
  35. }
  36. String String:: operator+( const String& s ) const
  37. {
  38.     String tmp( "" );
  39.     delete[] tmp.data_;
  40.     tmp.data_ = new char[strlen(data_)+strlen(s.data_)+1];
  41.     strcpy( tmp.data_, data_ );
  42.     strcat( tmp.data_, s.data_ );
  43.     return tmp;
  44. }

  45. int main()
  46. {
  47.     String s("hello" );
  48.     String s1("world" );

  49.     String s3("");
  50.     s3 = s + s1;

  51.     return 0;
  52. }
復(fù)制代碼

論壇徽章:
59
2015年亞洲杯之約旦
日期:2015-01-27 21:27:392015年亞洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵節(jié)徽章
日期:2015-03-06 15:50:392015年亞洲杯之阿聯(lián)酋
日期:2015-03-19 17:39:302015年亞洲杯之中國
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03雙子座
日期:2014-12-10 21:39:16處女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [報告]
發(fā)表于 2013-11-06 08:43 |只看該作者
回復(fù) 4# bruceteen


    有道理, 要改
  1. String& String::operator=( const String& s )
復(fù)制代碼
就行了。

寫過很多operator+ =, 都自動加上const了, 中毒太深~~

論壇徽章:
0
6 [報告]
發(fā)表于 2013-11-06 14:21 |只看該作者
本帖最后由 andy_hqj 于 2013-11-06 14:58 編輯

回復(fù) 4# bruceteen


如果把拷貝構(gòu)造函數(shù)中的const去掉  編譯時提示第10行,也就是  s3=s+s1;
main.cpp:10: 錯誤:對 ‘String::String(String)’ 的調(diào)用沒有匹配的函數(shù)
str.h:9: 附注:備選為: String::String(String&)
str.h:8: 附注:         String::String(char*)

這里不是應(yīng)該調(diào)用賦值運(yùn)算符重載函數(shù)嗎?這么會找構(gòu)造函數(shù)的?

如果拷貝構(gòu)造函數(shù)參數(shù)加上const 就能順利通過,可執(zhí)行的時候打印也沒看到調(diào)用構(gòu)造函數(shù).
如果改成這樣 String s3=s+s1; 同樣沒看到拷貝構(gòu)造函數(shù)調(diào)用。這是為什么啊?(我在構(gòu)造函數(shù)和拷貝構(gòu)造中都加了打印)


   

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽神
日期:2015-07-30 10:16:402015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
7 [報告]
發(fā)表于 2013-11-06 22:14 |只看該作者
回復(fù) 6# andy_hqj


    由于你的重載operator +的函數(shù)內(nèi)部使用了String tmp( "" );而""這樣的直接字符字面量實(shí)際上是const char*類型,它無法隱式轉(zhuǎn)換為char*也無法隱式轉(zhuǎn)換為string&,實(shí)際上可以轉(zhuǎn)換為rvalue的char*,但此例中參數(shù)的char*以及string&都是lvalue。

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀(jì)念徽章
日期:2015-12-22 16:50:40IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術(shù)圖書徽章
日期:2016-07-19 13:54:03程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
8 [報告]
發(fā)表于 2013-11-06 23:02 |只看該作者
本人過去、現(xiàn)在以及將來都不認(rèn)識樓主,且自古以來與樓主無利益關(guān)系。樓主表述之事與本人無關(guān).

論壇徽章:
0
9 [報告]
發(fā)表于 2013-11-07 11:15 |只看該作者
回復(fù) 7# myworkstation


那你的意思是實(shí)際報錯的是 String  tmp("");?
那String s("hello" );String s1("world" );這兩句為什么沒報這個錯誤呢?
如果是這句報錯,那也應(yīng)該是報 String(const char *)沒有匹配的函數(shù)吧?



   

論壇徽章:
17
處女座
日期:2013-08-27 09:59:352015亞冠之柏太陽神
日期:2015-07-30 10:16:402015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-29 18:58:182015年亞洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥豬
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56雙子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [報告]
發(fā)表于 2013-11-07 16:16 |只看該作者
回復(fù) 9# andy_hqj


    你用的哪個編譯器?假如我說的問題在你的編譯器不存在,單獨(dú)分析兩次賦值:String s3=s+s1;這種方式叫copy initialize,需要調(diào)用copy構(gòu)造函數(shù),而String s3;s3=s+s1;這樣的方式調(diào)用的是operator = ,當(dāng)你把copy構(gòu)造函數(shù)String::String( const String& s )中參數(shù)的const去掉變成String::String( String& s ),第一種方式肯定有問題String s3=s+s1,因?yàn)閟+s1是個臨時對象無法轉(zhuǎn)換為lvalue引用。而第二種方式由于你重載的操作符String String:: operator+( const String& s ) const,返回的結(jié)果是個String,那么return tmp;是有問題的,因?yàn)閠mp要copy到函數(shù)返回值中,而這個copy無法進(jìn)行(函數(shù)返回值賦值處也有一個臨時對象,原因同上臨時對象無法轉(zhuǎn)換為lvalue引用,所以operator+調(diào)用是失敗的,錯誤提示沒有準(zhǔn)確的提示到),你改成String& String:: operator+( const String& s )這樣的原型應(yīng)該就不會出這個錯誤了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP