c++面向對象高級編程 學習一 不帶指針的類

復數類 complex 是一個不帶指針的類,其聲明如下:

class complex
{
public:
complex(double r=0,double i=0):re(r),im(i){}
complex& operator +=(const complex&);
double real()const{return re;}
double imag()const{return im;}private:
double re,im;
friend complex& __doapl(complex *,const complex&);
}

對以上代碼進行解釋如下:

double re,im;

對類中的數據進行聲明,即實部和虛部,類中的數據應該是private的,不能被其他類訪問到,
在c++中訪問類的私有成員變量主要通過:set/get接口,友元類,友元函數。

double real()const{return re;}
double imag()const{return im;}

函數若在類體內定義完成,則自動成為inline候選,在類體外,加inline關鍵字,則其可成為inline候選。當對程序進行編譯時,若inline候選的程序比較簡潔,編譯器會將其按照inline進行處理,若inline候選的程序比較負責,則編譯器不會將其按照inline處理。
上面的函數是常量成員函數,即,該函數不改變類中成員數據的內容,其中const的位置是在參數列表后,即在()后面,{}前面。在確定函數不改變數據內容的時候,一定要將函數寫成常量成員函數的形式,即一定要加const。因為常量類只能調用常量成員函數,若函數不加const,則常量類調用該函數的時候就會出現錯誤,因為調用非常量成員函數,會改變類的成員數據,即與常量類自相矛盾。

complex(double r=0,double i=0):re(r),im(i){}
//re(r),im(i)是對參數進行初始化
complex(double r=0,double i=0){re=r;im=i;}
//對參數進行賦值

構造函數中要盡量使用值的初始化,而不是賦值,這樣性能會更高。
構造函數也可放在類的private區域,此時使用構造函數創建類將是錯誤的,因為private不能被訪問到,即不允許外界通過構造函數創建類,單例模式即是如此。

參數傳遞和返回值傳遞,盡量選擇使用引用傳遞。因為值傳遞會將參數進行拷貝并傳遞,浪費空間,值傳遞不會改變原始數據。而引用傳遞,是參數的別名,不需要對數據進行拷貝,可提高程序的性能,引用傳遞會改變原始數據。
返回值傳遞,首先考慮引用傳遞,再考慮引用是否可行,若不可行,再選擇值傳遞。返回值傳遞時,若傳遞的數據是函數中新定義的局部變量,此時要選擇值傳遞,因為若選用引用傳遞的話,當這個類消失的時候,該函數以及其定義的局部變量均會消失,而當其局部變量作為引用傳遞的返回值依然存在時,則會出現問題。即,當一個函數進行操作后,將操作的結果在函數里新建了一個變量來保存這個結果時,這種情況就不能返回引用;當一個函數進行操作后,將操作的結果放在某個參數里進行返回的時候,可以返回引用。

操作符重載的一般格式如下:

函數類型 operator 運算符名稱 (形參列表)
{
對運算符的重載處理
}
complex& operator +=(const complex&);

此處是對 += 進行操作符重載。此處參數是const complex&,其中const表示對該參數不進行修改,即可加const。此處還包含一個隱式參數,例如,c1+=c2,調用的即為c1.operator+=(c2),此處實現為:

inline complex&
__doapl(complex* ths, const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
inline complex&
complex::operator += (const complex& r)
{
return __doapl (this, r);
}

即,c1調用operator+=函數,c1作為隱式參數,和c2調用__doapl()函數,并將最后的操作結果作為引用傳遞傳回c1。

當操作符重載不作為成員函數時,就沒有隱式參數。例如:
此處返回值是值傳遞,是因為對數據進行操作后,將返回結果保存在一個新建的變量中進行返回的,因此用值傳遞。可根據參數的不同進行重載。

complex operator +(const complex& x,const complex& y);
complex operator +(const complex& x,double y);
complex operator +(double x,const complex& y);
complex operator +(const complex& x); //例如:正號的作用

對輸出函數進行重載:
此處也是選擇非成員函數的方式,因為此時直接調用cout<<c1即可進行輸出函數。
如果選擇成員函數的形式,則調用方式則變為:c1<<cout,與常用方式不同。
返回值是ostream&的原因是:調用cout<<c1<<c2時不會出錯,另外,參數ostream& os不是const的原因是,代碼對os進行了改變。

#include <iostream.h>
ostream& operator << (ostream& os,const complex& x)
{
return os << '(' << real (x) << ','<< imag (x) << ')';
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446634.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

codeforces 734A-C語言解題報告

734A題目網址 題目解析 1.輸入n個結果,再輸入每一個結果(A或D),統計A和D的數目,A>D,則輸出Anton,A<D,輸出Danik,AD,輸出Friendship 代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() { int n0,A0…

Linux進程之間通信 消息隊列

使用命令 ipcs -q 查看對應的消息隊列代碼 文件接收者 #include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <string> #include <signal.h> #include <wait.h> #include <sys/msg.h> #include <cstring&g…

c++面向對象高級編程 學習二 帶指針的類

帶指針的類&#xff0c;必須要自己寫拷貝構造和賦值構造 拷貝構造&#xff1a;參數和類的類型一樣的構造函數 賦值構造&#xff1a;重寫操作符&#xff0c;且其參數和類的類型一樣 class String { public: String(const char* cstr 0); String(const String& str); Strin…

英語口語 week11 Tuesday

英語文章 It was a cold and gloomy winter afternoon, people with their chilled hands tucked into their pockets or hidden in their sleeves. Fred was in a depressed mood, just like the weather,for he failed to get any award in the debate competition When he …

codeforces 271A-C語言解題報告

271A題目網址 題目解析 1.輸入一個年份,求這個年份之后的每一個數字都各不相同的年份 舉例: 輸入: 2013 輸出: 2014 2.求年份(四位數)的每一位數,再把這些數逐個比較 四位數求: 千位:n/1000 百位:n%1000/100 十位:n%100/10 個位:n%10/1; 代碼 #include<stdio.h> #in…

進程之間通信 共享內存

命令 ipcs 命令查看共享內存、消息隊列、管道等相關信息ipcs -m 查看共享內存的信息代碼 創建共享內存共享內存 關聯 進程分離共享內存刪除共享內存 #include <sys/shm.h> #include <iostream>#define BUF_SIZE 1024int main() {int share_id 0;//創建共享內存i…

c++面向對象高級編程 學習三 堆、棧和內存泄漏

棧&#xff0c;是存在于某作用域的一塊內存空間。在函數體內聲明的任何變量&#xff0c;其所使用的內存空間均來自于棧。 堆&#xff0c;是指由操作系統提供的一塊global內存空間&#xff0c;程序可動態分配獲得若干內存空間塊。 new操作符生成的對象所占用的內存空間即是從堆中…

clion編寫C++ 使用多線程時候,CMakeLists.txt書寫,引用-pthread

添加如下一行 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") 具體的例子 cmake_minimum_required(VERSION 3.17) project(mutex_learn)set(CMAKE_CXX_STANDARD 14)set(BOOST_ROOT "/usr/local/include/boost") #添加頭文件搜索路徑 include_direc…

codeforces 677A-C語言解題報告

677A題目網址 題目解析 1.輸入n個數字,如果輸入的數字比h大,就加2,如果小于等于h,就加1 舉例: 輸入: 3 7 4 5 14 輸出: 4 代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() { int n0,h0,count0;int nu…

c++面向對象高級編程 學習四 靜態、類模板、函數模板

靜態static&#xff1a;靜態數據和靜態函數&#xff0c;在內存中只有一份&#xff0c;不會隨著創建對象的數目的增加而增加 static數據&#xff1a;比如銀行的account類中&#xff0c;賬戶名是普通數據&#xff0c;100個對象會有100個賬戶名&#xff0c;但利率都是相同的&#…

線程的編程

完整代碼 #include <sys/shm.h> #include <iostream> #include <unistd.h> #include <pthread.h>void * child1(void *arg){pthread_t tid pthread_self();printf("1 thread %lu \n",tid);}int main(int argc,char* argv[]) {int result{…

英語口語 week11 Friday

英語文章 I very much like simplicity in life. For me, college is far more than a place to improve my intellectual abilities Every weekend, I usually have a walk along the way to the front gate of Mount Qingcheng, enjoying the intense aromas of flowers on …

c++面向對象高級編程 學習五 組合、委托與繼承

組合 composition 表示has a queue類中有一個deque容器&#xff0c;這種關系叫做 組合 queue中的六個函數都是調用c的函數完成的 template <class T> class queue { ... protected: deque<T> c; // 底層容器 public: // 以下完全利用 c 的操作函數完成 bool empt…

C++四種類型轉換運算符:static_cast、dynamic_cast、const_cast和reinterpret_cast

參考鏈接 C四種類型轉換運算符&#xff1a;static_cast、dynamic_cast、const_cast和reinterpret_cast

英語口語 week12 WednesDay

英語文章 Chengdu, a city with a long history, has always enjoyed the reputation as " The Land of Abundance" . It has been noted as one of the most livable cities in China, partly resulting from its favorable natural conditions and wealthy produc…

c++面向對象高級編程 學習六 虛函數

虛函數&#xff1a;在成員函數前面加上virtual&#xff0c;函數就變成了虛函數 繼承函數&#xff1a;子類可以調用父類的函數&#xff0c;叫做繼承了函數&#xff0c;即函數的調用權 三種函數&#xff1a; non-virtual 函數&#xff1a; 你不希望 derived class 重新定義 (ov…

C++ 數據結構 線性鏈表

#pragma once 減少頭文件組合&#xff0c;降低編譯出錯的概率作用等效于 #ifndef FUNC_H #define FUNC_H代碼主體#endif 線性表的定義 排隊問題 簡單的線性表 (物理 或者邏輯結構)1&#xff0c;數組2&#xff0c;鏈表線性表相關操作&#xff1a;1&#xff0c;線性表初始化2&a…

英語口語 week12 Thursday

英語文章 As the pace of life quickens with technological advancements, people are occupied by all kinds of trivial matters. They seem forever on the go. There’s no difficulty in imagining that the hustle and bustle of everyday life can make us lose focus…

H.264/AVC視頻編解碼技術詳解 第一章 視頻信息與壓縮編碼

H.264/AVC視頻編解碼技術詳解系列筆記 是對 H.264/AVC視頻編解碼技術詳解 課程的學習 文章目錄人與世界的交互視頻信號的表示方法視頻壓縮編碼視頻信息為什么可以被壓縮&#xff1f;視頻壓縮編碼的分類&#xff1a;視頻壓縮編碼的基本技術人與世界的交互 從遠古時代開始&#…

英語口語 week13 Monday

英語文章 Competitions between businesses can be very aggressive in contemporary society. However, the competition for talented personnel is thought to be the key to business competition. Wise employers consider their employees as the company’s core asset…