NDK—C++類

上一篇我們學(xué)習(xí)了C++的命名空間拔创,這篇我們來了解一下C++的構(gòu)造和析構(gòu)函數(shù)

廢話不多說,開始擼碼

正文

構(gòu)造函數(shù)富蓄、析構(gòu)函數(shù)剩燥、拷貝構(gòu)造函數(shù)

來個(gè)簡單的例子,了解一下構(gòu)造和析構(gòu)的寫法

class Teacher{
    public:
        int age;
    public:
        Teacher(){
            cout << "無參構(gòu)造函數(shù)" << endl;
        }
        ~Teacher(){
            cout << "析構(gòu)函數(shù)" << endl;
        }
    };

當(dāng)類沒有構(gòu)造函數(shù)的時(shí)候默認(rèn)會有一個(gè)無參的構(gòu)造函數(shù)立倍,構(gòu)造函數(shù)的作用是初始化變量灭红,析構(gòu)函數(shù)則釋放資源

既然有了構(gòu)造函數(shù),那怎么創(chuàng)建對象呢口注?

無參構(gòu)造:   Teacher t;
有參構(gòu)造:   Teacher t1("lypop", 21);
            Teacher t2 = Teacher("lypop", 21);
創(chuàng)建指針:   Teacher *tt = new Teacher("lypop",21);

對于析構(gòu)函數(shù)的調(diào)用变擒,我們將創(chuàng)建放在一個(gè)方法里面,當(dāng)方法執(zhí)行結(jié)束便會執(zhí)行析構(gòu)函數(shù)

class Teacher{
private:
    char *name;
    int age;
public:
    Teacher(){
        this->name = (char*)malloc(100);
        strcpy(name, "lypop");
        age = 20;
        cout << "無參構(gòu)造函數(shù)" << endl;
    }
    
    //析構(gòu)函數(shù)
    ~Teacher(){
        cout << "析構(gòu)" << endl;
        //釋放內(nèi)存
        free(this->name);
    }
};

void func2(){
    Teacher t;
}

我們只需要在析構(gòu)函數(shù)中釋放相應(yīng)的資源

除了構(gòu)造函數(shù)和析構(gòu)函數(shù)疆导,類里面有個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),它只是一種值拷貝葛躏,當(dāng)類中有指針屬性的時(shí)候容易發(fā)生崩潰澈段。所以當(dāng)我們類中有指針需要在析構(gòu)函數(shù)釋放資源的時(shí)候,拷貝構(gòu)造函數(shù)都使用深拷貝

下面來看一下值拷貝(淺拷貝)

class Teacher{
private:
    char *name;
    int age;
public:
    Teacher(char *name, int age){
        this->name = (char*)malloc(100);
        strcpy(this->name,name);
        this->age = age;
        cout << "有參構(gòu)造函數(shù)" << endl;
    }   
    ~Teacher(){
        cout << "析構(gòu)" << endl;
        //釋放內(nèi)存
        free(this->name);
    }
};

void func(){
    Teacher t1("rose", 20);

    Teacher t2 = t1;//這時(shí)候會調(diào)用默認(rèn)的拷貝構(gòu)造函數(shù)
}

當(dāng)func執(zhí)行完畢之后就會調(diào)用兩次析構(gòu)舰攒,因?yàn)橹皇呛唵蔚闹悼截惏芨唬琻ame指針指向的是同一塊內(nèi)存地址,當(dāng)?shù)谝粋€(gè)被釋放掉在釋放第二個(gè)的時(shí)候就會出錯(cuò)摩窃。所以需要解決這種就需要深拷貝兽叮,也就是重寫拷貝構(gòu)造函數(shù)為name重新開辟一塊內(nèi)存地址

//深拷貝
Teacher(const Teacher &obj){
    //復(fù)制name屬性
    int len = strlen(obj.name);
    this->name = (char*)malloc(len+1);
    strcpy(this->name,obj.name);
    this->age = obj.age;
}

拷貝構(gòu)造函數(shù)被調(diào)用的場景:

  1. 聲明時(shí)賦值
  2. 作為參數(shù)傳入芬骄,實(shí)參給形參賦值
  3. 作為函數(shù)返回值返回鹦聪,給變量初始化賦值
C和C++創(chuàng)建指針和釋放資源
C  創(chuàng)建 int *p1 = (int*)malloc(sizeof(int) * 10);
   釋放 free(p1);

C++創(chuàng)建 int *p2 = new int[10];
   釋放 delete[] p2;//釋放數(shù)組指針  delete p;//釋放指針
C++訪問靜態(tài)屬性和方法

通過類名::來訪問,也可以通過類對象來訪問

int Teacher::total = 9;
Teacher::total++;
Teacher::count();
常量對象泽本、常函數(shù)

Teacher *const this;能改變指針指向的內(nèi)容淘太,不能改變指針的值

const Teacher* const this;既不能改變指針的值规丽,又不能改變指針指向的內(nèi)容

常量對象只能調(diào)用常量函數(shù),不能調(diào)用非常量函數(shù)赌莺。常函數(shù)當(dāng)前對象不能被修改冰抢,防止數(shù)據(jù)成員被非法訪問

class Teacher{
    void myprint() const{
        
    }
};
void main(){
    const Teacher t1("aaa",22);

    t.myprint(); 

    system("pause");

}
友元函數(shù)、友元類

友元函數(shù)的實(shí)現(xiàn)艘狭,在友元函數(shù)中可以訪問私有的屬性

class A{
friend void modify_i(A *p, int a);
private:
    int i;
};
void modify_i(A *p, int a){
    p->i = a;
}

友元類中可以訪問友元對象所在類的所有成員

class A{
friend class B;
private:
    int i;

};

class B{
public:
    //B這個(gè)友元類可以訪問A類的任何成員
    void accessAny(){
        a.i = 30;
    }
private:
    A a;
};
運(yùn)算符重載
  1. 類外進(jìn)行運(yùn)算符重載

     class Point{
     public:
         int x;
         int y;
     public:
         Point(int x = 0, int y = 0){
             this->x = x;
             this->y = y;
         }
     
         void myprint(){
             cout << x << "," << y << endl;
         }
     
     };
     
     Point operator+(Point &p1, Point &p2){
         Point tmp(p1.x+p2.x,p1.y+p2.y);
         return tmp;
     }
     
     Point operator-(Point &p1, Point &p2){
         Point tmp(p1.x - p2.x, p1.y - p2.y);
         return tmp;
     }
    
  2. 類內(nèi)進(jìn)行運(yùn)算符重載

     class Point{
     public:
         int x;
         int y;
     public:
         Point(int x = 0, int y = 0){
             this->x = x;
             this->y = y;
         }
         //成員函數(shù)挎扰,運(yùn)算符重載
         Point operator+(Point &p2){
             Point tmp(this->x + p2.x, this->y + p2.y);
             return tmp;
         }
         void myprint(){
             cout << x << "," << y << endl;
         }
         };
    
  3. 當(dāng)屬性私有的時(shí)候需要使用友元函數(shù)實(shí)現(xiàn)運(yùn)算符重載

     class Point{
     friend Point operator+(Point &p1, Point &p2);
     private:
         int x;
         int y;
     public:
         Point(int x = 0, int y = 0){
             this->x = x;
             this->y = y;
         }   
         void myprint(){
             cout << x << "," << y << endl;
         }
     };
     
     Point operator+(Point &p1, Point &p2){
         Point tmp(p1.x + p2.x, p1.y + p2.y);
         return tmp;
     }
    

但是運(yùn)算符重載的本質(zhì)還是函數(shù)的調(diào)用,至此C++的類就總結(jié)到這里缓升,謝謝不耐其煩的看完鼓鲁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市港谊,隨后出現(xiàn)的幾起案子骇吭,更是在濱河造成了極大的恐慌,老刑警劉巖歧寺,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燥狰,死亡現(xiàn)場離奇詭異,居然都是意外死亡斜筐,警方通過查閱死者的電腦和手機(jī)龙致,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顷链,“玉大人目代,你說我怎么就攤上這事∴土罚” “怎么了榛了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煞抬。 經(jīng)常有香客問我霜大,道長,這世上最難降的妖魔是什么革答? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任战坤,我火速辦了婚禮曙强,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘途茫。我一直安慰自己碟嘴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布慈省。 她就那樣靜靜地躺著臀防,像睡著了一般。 火紅的嫁衣襯著肌膚如雪边败。 梳的紋絲不亂的頭發(fā)上袱衷,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音笑窜,去河邊找鬼致燥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛排截,可吹牛的內(nèi)容都是我干的嫌蚤。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼脱吱,長吁一口氣:“原來是場噩夢啊……” “哼箱蝠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宦搬,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤间校,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后憔足,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酒繁,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年找蜜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稳析。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诚纸,死狀恐怖陈惰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抬闯,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布杯缺,位于F島的核電站睡榆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胀屿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一亲铡、第九天 我趴在偏房一處隱蔽的房頂上張望劳曹。 院中可真熱鬧,春花似錦铁孵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婴削,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唉俗,已是汗流浹背配椭。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工股缸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吱雏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓镰惦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陨献。 傳聞我的和親對象是個(gè)殘疾皇子懂更,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • /*類和對象 1.類和實(shí)例化定義類聲明類定義成員函數(shù)數(shù)據(jù)成員的賦值使用類的對象沮协。 2.構(gòu)造函數(shù)數(shù)據(jù)封裝默認(rèn)構(gòu)造函數(shù)...
    aofeilin閱讀 1,065評論 1 2
  • 2.1 類的基礎(chǔ)知識2.2 構(gòu)造函數(shù)2.3 拷貝構(gòu)造函數(shù)2.4 析構(gòu)函數(shù)2.5 C++能自動(dòng)產(chǎn)生成員函數(shù)2...
    笑笑學(xué)生閱讀 413評論 0 0
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,845評論 0 6
  • 1.面向?qū)ο蟮某绦蛟O(shè)計(jì)思想是什么聘殖? 答:把數(shù)據(jù)結(jié)構(gòu)和對數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的方法封裝形成一個(gè)個(gè)的對象。 2.什么是類奸腺?...
    少帥yangjie閱讀 5,011評論 0 14
  • //出自51博客:www.Amanda0928.51.com 第一章 一血久、選擇題 1.B; (typedef ,t...
    Damongggggg閱讀 11,135評論 0 1