CA operator CA t 賦值函式中,去掉後,為什麼S2的資源空間丟失了

2021-03-22 07:52:54 字數 4578 閱讀 5904

1樓:ok洛陽水席

因為過載=運算子就是等價於過載一個函式,引數是兩個類的物件;

這樣兩個都加了&就是使用引用,沒加& 就是值傳遞,編譯器會建立類的副本,修改的就是副本的值,不會修改引數的值。這裡會發生一個問題,那就是副本里的指標與引數的指標指向的地址相同,這就導致函式結束時,編譯器會呼叫副本的解構函式,這就導致引數裡的指標指向的地址是錯誤的!字串已經不存在了!

懂了麼……不懂再問!

(1)建立字串類 (2)利用運算子過載的概念實現串賦值(=)、串比較(==、!=、<、>)、串連線(+)運算; (3

2樓:匿名使用者

先宣告網上看到的,大概看了下,應該符合你的要求

/*具體要求:

1.使用動態分配儲存空間的方法存放字串,避免使用預先定義的長度很大的陣列;

2.定義字串類string,定義相關成員函式(可以是運算子過載函式)實現字串的連線(+)、

拷貝(=和拷貝建構函式)、去掉串首、串尾與子串相同的字元(-),子串在主串中的定位

,用新子串更換主串中的指定子串、求字串的長度等;

3.在主函式main()中新增程式中定義string類的各成員函式的測試語句,來驗證字串處理函式的功能。

這是一個課程設計,請高手能夠做的像課程設計一些啊,謝謝!*/

#include

#include

class cstring

void display();

~cstring();

private:

char *str;

};cstring::cstring()

cstring::cstring(cstring &s)

}cstring::cstring(char *s)

}bool operator >(cstring s1,cstring s2)

bool operator <(cstring s1,cstring s2)

bool operator ==(cstring s1,cstring s2)

else if(s1

else

cout<<"主字串:";s1.display();

cout<<"要刪除的子字串:";s3.display();

s1=s1-s3;

cout<<"去掉串首、串尾與子串相同的字元後"<

cout<<"s1:";s1.display();

cout<<"主字串:";s1.display();

cout<<"新字串:";s2.display();

update(s1,s2);

return 0;

}/*賦值符號在過載時,不能作為類的友元函式,只能是類的成員函式*/

3樓:匿名使用者

網上摘的和自己做的有什麼很大的區別麼,我們給你做了你拿去用同樣也是網上摘的

為什麼c++中內建陣列型別不支援陣列之間的賦值,支援這種操作需要什麼資訊?

4樓:幻の上帝

源**級別和c語言相容性的考慮。當年的c++完全向下相容c;雖然現在標準c和標準c++有相當大的差別,但是表面上的公共語言特性都沒有很大改變。

c語言中,陣列在許多情況下都會隱式轉換為對應的指向陣列首個元素的指標(對應的型別轉換稱為退化)。有了陣列的退化特性,同時通過p[i]和*(p+i)的等價性就可以以比較方便的語法形式引用陣列的元素;且在引數傳遞時陣列退化為指標對一般目的而言是比較高效的,無需按值傳遞(複製)整個陣列。這樣做的***就是對於operator=而言,為了維護左運算元作為陣列名或對應指標名錶現的行為的一致性(注意c語言中沒有運算子過載,內建運算子的行為對於各種型別而言語義大體一致),陣列在這裡退化為指標而不表示整個陣列。

而陣列退化得到的指標是常量,因此陣列無法作為operator=的左運算元。

理論上要實現陣列的內建賦值操作也不復雜,不過應該需要比較嚴格的型別檢查,比如陣列型別(元素型別和長度)完全相同或者元素型別相同但左運算元的長度大於等於右運算元的長度,但這樣應用很有限,並不是必要的。而且會導致上面的「=」的二義性問題。

實際上用迴圈對元素進行逐個賦值就可以解決這個問題。c標準庫函式memcpy可以實現連續儲存器區域按值複製的賦值語義,同樣適用於陣列(c/c++的陣列佔據連續的地址空間)。

c++中,可以使用迴圈或對應的std::memcpy。此外,也可以自行實現成員為陣列的結構體/類,然後過載operator和operator=實現可用=表示賦值的自定義陣列。

例如:template

class myarray

;(當然不支援「=」的設計也有一些缺陷。這樣的語言特性導致陣列不是first level citizen,除了直觀性問題外,還有其它的***。例如,多維陣列事實上是陣列的陣列,如果要用迴圈實現多維陣列間部分元素的複製,支援內建「=」的話一個一重迴圈就夠了,編譯器可以推斷出複製細節;而現在的需要用多重迴圈「=」,或者使用一重迴圈巢狀memcpy之類的用於實現複製細節的函式,形式上更麻煩。

)====

[原創回答團]

5樓:匿名使用者

陣列名其實代表著一個指標常量,所以將一下陣列名賦值給

另一個陣列,就像是把常量5賦值給常量3一樣,雖然語法正確,但在語意層面上會產生錯誤。

c++語言並未支援陣列的賦值操作,編譯器在編譯時必須知道陣列的長度,才能產生執行**,支援陣列對陣列的操作。

6樓:匿名使用者

for(i = 0; i < n; i++)b[i] = a[i];

或者用memcpy

將c++中的list模版第一個資料賦值給一個指標指向的空間

7樓:極天異雲

如果你置入list的是一個物件(而不是int等普通資料型別)的話那麼你必須過載=號來實現賦值,

或者你可以實現一個copy constructor來做。

c++可以預設呼叫那個建構函式來實現=操作。

我建議你如果用stl,最好使用迭代器來訪問中間的元素。

8樓:匿名使用者

#include

#include

using namespace std;

listt;

int main()

{t.push_back(1);

t.push_back(2);

int*a=new int;

*a=t.front();

cout <<*a<一個元素

t.begin()返回的是第一

個元素的地址

9樓:匿名使用者

list模版用指標不好!用iterator(智慧指標)撒

list::iterator iter;

iter=list.begin();就行了

10樓:匿名使用者

你沒include ? 或者沒 using ?

將申明和定義中 ostream&operator<<去掉後可成功執行,為何

11樓:匿名使用者

ostream&operator<<

引數c是個const引用,也就是個常物件。

但是你在函式體中呼叫

了area()函式,常物件只能呼叫常成員函式,而area並不是常成員函式,所以會編譯出錯。

解決辦法是把area函式定義為常成員函式,需要修改兩個地方:

宣告處:float area()const;

定義處:

float circle::area()const

matrix operator+(matrix &,matrix &);必須是友員函式?為什麼不能是成員函式?

12樓:匿名_熱心網友

#include

using namespace std;

#define pi 3.14

class shape};

c++裡面的建構函式,拷貝函式,賦值函式,菜鳥求解

13樓:逍遙海盜女

class test

//拷貝構造

test(test &t)

//賦值函式

當你定義一個物件時呼叫建構函式,若使用物件初始化則呼叫拷貝建構函式,賦值就是將一個物件的值賦給另一個

vba陣列賦值,VBA陣列的定義與賦值

1 開啟一個excel的檔案,在 中輸入簡單的 比如學生身高 如下圖所示。2 接著,在 中輸入一維陣列的說明文字,滑鼠左鍵單擊 開發工具 選單標籤,在vba控制元件下拉選單中,並選擇按鈕控制元件,如下圖所示。3 然後,在 中繪製出按鈕控制元件,並修改控制元件名稱,比如使用一維陣列的名稱,如下圖所示。...

結構體變數如何賦值可以直接賦值嗎

結構體變數是可以直接賦值的 定義結構體型別,然後用這個型別定義出來的變數就是結構體變數 c語言在相同型別的變數間賦值時是直接記憶體複製的,即將他們的記憶體進行復制,這裡因為同樣結構體變數,屬於同一種變數,所以賦值時是按照他們的記憶體分佈來直接拷貝的。結構體的賦值僅僅是簡單的淺複製,如果涉及到指標型別...

c 整型指標賦值的問題,C 整型指標賦值的問題

你好,你應該通過malloc申請空間,或者是用陣列 現在你這樣p i指向的是一個未知空間,可能是系統需要用到的,不允許你更改內容,即使允許你這樣也是不對的,因為這個空間屬於這個程式,用它就是錯誤的。你只申請了一個int的空間,卻操作了256個int,當然不對了 char p abc 是在記憶體開闢4...