主頁 > 後端開發 > C++基礎之物件的關系

C++基礎之物件的關系

2020-09-13 05:47:20 後端開發

一、變數

1、變數和類的生命周期
變數的生存期是指變數所占據的記憶體空間由分配到釋放的時期,變數有效的范圍稱為其作用域,全域變數是程式中定義在所有函式(包括main函式)之外的任何變數,其作用域
是程式從變數定義到整個程式結束的部分,這意味著全域變數可以被所有定義在全域變數之后的函式訪問,全域變數及靜態變數分配的空間在全域資料區,它們的生存期為整個程式的執行期間,
? 而區域變數,如在函式內或程式塊內說明的變數,被分配到區域資料區,如堆疊區等,這種分配是臨時的,一旦該函式體或程式塊運行結束,所分配的空間就會被撤銷,區域變數的生存期從被說明處開始,到所在程式塊結束處結束,
? 對于靜態變數,如果沒有進行初始化,系統會自動初始化為0,區域變數如果沒有進行初始化,則其值是不確定的,
? 使用new運算子創建的變數具有動態生存期,從宣告處開始,直到用delete運算子釋放存盤空間或程式結束時,變數生存期結束,類的物件在生成時呼叫建構式,在消亡時呼叫解構式,在這兩個函式呼叫之間即是物件的生存期,

2、在類中,也可以使用const關鍵字定義成員變數和成員函式,甚至是類的物件,由關鍵字const修飾的類成員變數稱為類的常量成員變數,類的常量成員變數必須進行初始化,而且只能通過建構式的成員初始化串列的方式進行,使用const修飾的函式稱為常量函式,定義類的物件時如果在前面添加const關鍵字,則該物件稱為常量物件,定義常量物件或常量成員變數的一般格式如下:
const 資料型別 常量名=運算式;
? 定義常量函式的格式如下:型別說明符 函式名(引數表)const;
? 在物件被創建以后,其常量成員變數的值就不允許被修改,只可以讀取其值,對于常量物件,只能呼叫常量函式,總之,常量成員變數的值不能修改,常量物件中的各個屬性值均不能修改,
? 不能通過常量物件呼叫普通成員函式 const Person person;person.getName();//錯誤的

 一、封閉類

當生成封閉類的物件并進行初始化時,它包含的成員物件也需要被初始化,需要呼叫成員物件的建構式,在定義封閉類的建構式時,需要添加初始化串列,指明要呼叫成員物件的哪個建構式,在封閉類建構式中添加初始化串列的格式如下:
封閉類名::建構式名(引數表): 成員變數1(引數表),成員變數2(引數表),…{…}
初始化串列中的成員變數既可以是成員物件,也可以是基本資料型別的成員變數,對于成員物件,初始化串列的“引數表”中列出的是成員物件建構式的引數(它指明了該成員物件如何初始化),
先呼叫成員物件的建構式,再呼叫封閉類物件的建構式,

2、封閉類的復制建構式
如果封閉類的物件是用默認復制建構式初始化的,那么它包含的成員物件也會用復制建構式初始化,

//成績類
class Course{
    public:
        int id;
        string name;
        Course();
        Course(Course &course);
        Course(int id,string name);
};
Course::Course(Course &course){
    cout << "Course 復制建構式" << endl;
    this->id=course.id;
    this->name=course.name;
}
Course::Course(int id,string name){
    this->id=id;
    this->name=name;
    cout << "Course 普通建構式" << endl;
};
//學生類
class Student{
    public:
        int id;
        string name;
        //學生類中包含課程(Course),Student 稱為封閉類
        Course course;
        Student(int id,string name,int cId,string cName);
        void show();   
};
Student::Student(int id,string name,int cId,string cName):id(id),name(name),course(cId,cName){
   cout << "Student 普通建構式" << endl;
}
void Student::show(){
   cout << "name:"  << this->name  <<" course:" << this->course.name<< endl;
}
int main(){
    Student student(1,"小米",1,"數學");
    student.show();
    Student student2(2,"美團",1,"C++");
    student2.show();
}

 三、this指標

C++語言規定,當呼叫一個成員函式時,系統自動向它傳遞一個隱含的引數,該引數是一個指向呼叫該函式的物件的指標,稱為this指標,從而使成員函式知道對哪個物件進行操作,
? C++規定,在非靜態成員函式內部可以直接使用this關鍵字,this就代表指向該函式所作用的物件的指標,
? 在一般情況下,在不引起歧義時,可以省略“this->”,系統采用默認設定,
? 靜態成員是類具有的屬性,不是物件的特征,this表示的是隱藏的物件的指標,所以靜態成員函式沒有this指標,

void Person::setName(string name){
    this->name=name;
}
string Person::getName(){
    return this->name;
}
void Person::setId(int id){
    this->id=id;
}
int Person::getId(){
    return this->id;
}

四、物件的性質 

1、同一類的物件之間可以相互賦值,
  如陳述句:Point A,B; A.Setxy(25,55); B=A;
2、可以使用物件陣列,
  如陳述句:Point A[3]; 定義陣列A可以存盤3個Point類的物件,
3、也可以使用指向物件的指標,使用取地址運算子&將一個物件的地址置于該指標中,
  如陳述句: Point * p=&A; p->Display();
4、物件可以用作函式引數,
如果引數傳遞采用傳物件值的方式,會在傳值程序中產生副本,即臨時物件,所以在被呼叫函式中對形參所作的改變不影響呼叫函式中作為實參的物件,
如果采取傳物件的參考(傳地址)的方式,當形參物件被修改時,相應的實參物件也將被修改,如果采用傳物件地址值的方式,則使用物件指標作為函式引數,效果與傳物件的參考一樣,
C++推薦使用物件的參考作為引數傳遞,因為這樣不會產生副本(即臨時物件),在程式執行時不用呼叫建構式,可直接進入函式體執行陳述句,在函式結束后,也不用呼叫解構式析構臨時物件,如想避免被呼叫函式修改原來物件的資料成員,可使用const修飾符,

  • void print(Point a){a.Display;} //物件作為函式引數
  • void print(Point&a){a.Display;} //物件參考作為函式引數
  • void print(Point * p){p->Display;} //物件指標作為引數

它們的原型宣告分別為:print(Point),print(Point&),print(Point *),
對于物件A,print(&A)呼叫的是原型為print(Point *)的函式形式,
另外,函式多載不能同時采用如上3種同名函式,因為函式使用的引數為物件或物件參考時,編譯系統無法區別這兩個函式,多載只能選擇其中的一種,

五、類的使用權限

使用類的權限
①類本身的成員函式可以使用類的所有成員(私有和公有成員),
②類的物件只能訪問公有成員函式,例如輸出x只能使用A.Getx(),不能使用A.x,
③其他函式不能使用類的私有成員,也不能使用公有成員函式,它們只能通過定義類的物件為自己的資料成員,然后通過類的物件使用類的公有成員函式,
④雖然一個類可以包含另外一個類的物件,但這個類也只能通過被包含的類的物件使用那個類的成員函式,通過成員函式使用資料成員,person 是 student的成員,student不能直接操作person中的屬性,只能 Student.person.成員的方式來操作person中的成員

class Person{
    public:
        int id;
        string name;    
};
class Student{
    public:
        Person person;
}

六、不完全的類的宣告

類不是記憶體中的物理物體,只有當使用類產生物件時,才進行記憶體分配,這種物件建立的程序稱為實體化,
類必須在其成員使用之前先進行宣告,然而,有時也可以在類沒有完全定義之前就參考該類,此時將類作為一個整體來使用,如宣告全域變數指標:

class MembersOnly; //不完全的類宣告
MembersOnly * club; //定義全域變數類指標
Void main(){… 函式體} //主函式
class MembersOnly{…函式體}; //完全定義該類

不完全宣告的類不能實體化,否則會編譯出錯;不完全宣告僅用于類和結構,企圖存取沒有完全宣告的類成員,也會引起編譯錯誤,

七、空類:

盡管類的目的是封裝代碼和資料,它也可以不包括任何宣告,如:class Empty{ }; 這種空類沒有任何行為,但可以產生空類物件,
在開發大的專案時,需要在一些類還沒有完全定義或實作時進行先期測驗,定義空類可保證代碼能正確被編譯,從而允許先測驗其中的一部分,此時常給空類增加一個無引數建構式,以消除強型別檢查的編譯器產生的警告,如
class Empty{
  public:Empty(){ }
};

八、類作用域

①宣告類時所使用的一對花括號形成類作用域,在類作用域中宣告的識別符號只在類中可見,如:class example { int num; } ;
  int i=num; //定義整型數i,并用num賦值;錯誤,因為num在類外并沒有定義,所以在此不可見
  int num; //重新定義整型數num;正確,因為此num是重新定義的一個整型數,與類中說明的資料成員num具有不同的作用域
②如果某成員函式的實作是在類定義之外給出的,則類作用域也包含該成員函式的作用域,因此,當在該成員函式內使用一個識別符號時,編譯器會先在類定義域中尋找,如下例:

class Myclass {
    int number; //定義屬于類Myclass的整型數number
    public:
        void set(int);
};
int number; //這個number不屬于類Myclass
void Myclass::set(int i){
    number=i; //使用的是類Myclass中的識別符號number
};

③類中的一個成員名可以通過使用類名和作用域運算子來顯式的指定,稱為成員名限定,例如:
void Myclass::set(int i){
  Myclass::number=i; //顯示指定訪問Myclass類中的識別符號number
}
④在程式中,物件的生存期由物件說明來決定;類中各資料成員的生存期由物件的生存期決定,隨物件存在和消失,
⑤使用struct關鍵字設計類與class相反,struct的默認控制權限是public,一般不用struct設計類,而是用struct設計只包含資料的結構,然后用這種結構作為類的資料成員,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20783.html

標籤:C++

上一篇:C語言程式結構

下一篇:有大神知道這個該怎么辦嗎?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more