C++學習記錄19--運算子過載為什麼要使用引用(=)
過載=
運算子時,標準定義為
class A
{
public:
A & operator =(line &b)
}
這裡,賦值函式的返回值是引用和類的拷貝建構函式有關。
實際上,定義為無返回值void operator =(line &b)
也可實現=運算子過載,但使用一個=號時沒有問題,使用兩個時有會型別不符
A a, b, c;
a=b=c;
//a=b=c等價於a=(b=c);
若返回值是void,則b=c後資料型別是void,則變成 A=void,報錯。
所以為了實現c++中連等的語法需要,講返回值定義為類的型別比較好。
有返回值時,為什麼一定要返回值是引用呢?
當執行到語句return *this;
時,會自動呼叫類的拷貝建構函式。
但是萬一由於沒有定義拷貝建構函式 ,就會呼叫預設的拷貝建構函式。而預設的拷貝建構函式時當在類中有指標時就會出錯(淺拷貝)。
所以如果你不用引用做返回時,就必須自定義的深拷貝建構函式,以防類成員中有指標或引用資料導致出錯。
另外拷貝建構函式引數也必須引用A (A &a)
,否則在函式體中又會呼叫拷貝建構函式,無限迴圈。
相關推薦
C++學習記錄19--運算子過載為什麼要使用引用(=)
過載=運算子時,標準定義為 class A { public: A & operator =(line &b) } 這裡,賦值函式的返回值是引用和類的拷貝建構函式有關。 實際上,定義為無返回值void operator =(lin
【C++學習筆記】運算子過載(二)
我們回顧一下運算子過載的特點: 運算子過載函式名必須為:operator<運算子>。 運算子的過載是通過運算子過載函式來實現的。對於二元運算子過載函式,函式的引數通常為一個即右運算元,運算子的左運算元為呼叫過載函式時的物件。對於一元運算子過載函式,運算子的左運算
【C++學習筆記】運算子過載(一)
在C++中我們定義了自己專屬的類,但是隨著類的增加,以及裡面成員複雜度的提高,以前我們常用的運算子就不能很好的處理新出現的資料型別了,這時,就有一個很“異想天開”的想法了——我們自己定義運算子! 運算子的過載 運算子過載是使同一個運算子作用於不同型別的資料時具有不同的行為。例如我們宣
c++學習記錄:operator = 過載
《effective c++》的確是一本神書,閱讀起來的感覺可以用酣暢淋漓來形容,似乎很多以前沒有在意的小細節都變得豁然開朗了起來,在條款10中,scott建議我們過載操作符’=’時,返回一個*this的引用。 賦值,我們往往可以寫作連鎖形式:
c++ 筆記,->理解,指標的引用(*&)與指標的指標(**)
一:->理解 網上百度看到的,說的很好,分享一下https://zhidao.baidu.com/question/143562807.html ->是一個整體,它是用於指向結構體、C++中的class等含有子資料的指標用來取子資料。換種說法,如果我們在C語言中
c++學習筆記之運算子的過載
運算子的過載包括雙目運算子+的過載和輸入輸出流運算子的過載。 程式碼的功能是實現2行3列矩陣的加法 程式碼如下 #include<iostream> using namespace std; class matrix { public: matrix(); frie
C++基礎學習筆記:運算子過載
(運算子過載和類轉換的練習程式碼) 標頭檔案: //MyClass.h #pragma once #include <iostream> //設計一個簡單的類來熟悉運算子過載與類的轉換 class MyClass { private: int num;//私有成員變數 pu
C++學習記錄
using 記錄 images block c++ blocks 錯誤提示 mage 可能 2017.09.02 今天使用codeblocks來寫一個Cat類,但是編譯的時候遇到“error: ‘string‘ does not name a type“的錯誤提示。 解
C#學習篇2:過載和重寫 虛方法和抽象方法
本篇問轉載文章,僅供學習使用。。。 過載(overload): 在同一個作用域(一般指一個類)的兩個或多個方法函式名相同,引數列表不同的方法叫做過載,它們有三個特點(俗稱兩必須一可以): 方法名必須相同 引數列表必須不相同 返回值型別可以不相同 例如: publ
c++學習記錄之類
c++是面向物件的程式語言 面對物件就是: 把資料及對資料的操作方法放在一起,作為一個相互依存的整體——物件。對同類物件抽象出其共性,形成類。類中的大多 數資料,只能用本類的方法進行處理。類通過一個簡單的外部介面與外界發生關係,物件與物
C++ 略坑的運算子過載練習
補充程式碼,使程式按要求輸出 #include <iostream> using namespace std; template <class T> class Add{ public: // 在此處補充你的程式碼 }; int mai
【C++學習記錄2】C到C++的升級
C++繼承了所有的C特性; C++在C的基礎上提供了更多的語法和特性; C++的設計目標是執行效率和開發效率(比C語言還高)的統一。 (C++中++的體現)C++是C語言的進化和升級。最重要的是兩個方面,其一是型別的加強(型別檢查更嚴格),其二是天生面向物件的支援(內建天生支援面向物件軟
【C++學習記錄1】學習C++的意義
UINX誕生之初使用匯編語言編寫的。隨著UINX的發展,組合語言成為了其發展的掣肘。如何提高UINX的開發效率呢? 在1971年,K&D來發出C語言,由解釋型語言(B語言)變成編譯型語言。 C語言天生就是為了開發作業系統而存在的,其目標是高效,最終程式執行效率高。但是起初是用來編寫U
YTUOJ——C++時間類的運算子過載
題目描述 C++時間類的運算子過載 定義一個時間類Time,其資料成員為表示時間的小時(hour)、分(minute),秒(second)。 過載運算子“+”,使之能用於時間物件的加法運算;過載運算子“<<”,使之能用於時間物件的輸出操作。 (1)參加運算的兩個運算元可以都是時間
解構函式(C++學習筆記 19)
一、什麼是解構函式? 解構函式也是一種特殊的成員函式。它執行與建構函式相反的操作,通常用於執行一些清理任務,如釋放分配給物件的記憶體空間等。 二、解構函式的特點是什麼? 1、解構函式名與類名相同,但它前面必須加一個波浪號(~)。 2、解構函式不返回任何值。在定義解構函式時,是不能
Objective-C 學習記錄
1.UINavigationController導航控制器的建立 UINavigationController是一種特殊的控制器,用於管理多控制器之間的跳轉,常見的例子是iPhone的設定 UINavigationController的使用步驟: (1).初始化UINavi
C ++中字串類運算子過載示例
一、基本概念 (一) 函式過載的含義 所謂過載,就是重新賦予新的含義。函式過載就是對一個已有的函式賦予新的含義,使之實現新功能,因此,一個函式名就可以用來代表不同功能的函式,也就是”一名多用”。 (二) 為什麼要進行函式過載 一般情況下,編譯器對現有操作符的運算元是有一定的限制,但是
C++知識積累:運算子過載時建構函式與解構函式呼叫次數不一致的問題
在學習運算子過載的時候自己寫了這樣一段程式: class Stu { public: Stu() { std::cout<<"Stu No parameter constructor called!"<<
focaltech(敦泰)觸控式螢幕驅動Ft5306.c學習記錄
最近正在做安卓系統的驅動開發工作,學習了focaltech(敦泰)觸控式螢幕驅動Ft5306.c,簡單總結如下(未完,待續)。因為剛接觸驅動開發,許多知識沒有徹底理解,如有錯誤請指正。 1 概述 linux觸控式螢幕驅動基於linux input 子系統,層次上位於input系統的第三層,主要是完成具
c++成員運算子過載和友元運算子過載的比較(以++,--運算子為例)
1、對雙目運算子而言,成員運算子過載函式引數列表中含有一個引數,而友元運算子過載函式引數列表含有兩個引數;對單目運算子而言,成員運算子過載函式引數列表中沒有引數,而友元運算子過載函式引數列表含有一個引數。 2、雙目運算子一班可以被過載為友元運算子和成員函式運算