類和構(gòu)造函數(shù)

什么是類

  • 類是定義同一類所有對(duì)象的變量和方法的藍(lán)圖或原型
#include<stdio.h>
#include<iostream>
using namespace std;
class Person
{
private://訪問(wèn)修飾符
        int id;
        int money;
public:
      void show()
      {
            cout<<"id = "<<id<<" money = "<<money<<endl;
      }
      void set(int a,int b)
      {
        if(a<0)
        {
            a=0;
        }
        id=a;
        money=b;
     }
};
int main()
{
    class Person a;
    class Person b;
    a.set(1,1000);
    a.show();
    b.set(2,100);
    b.show();
}

  • C++的類與結(jié)構(gòu)的區(qū)別
  • 在面向?qū)ο笾?算法與結(jié)構(gòu)體被捆綁在一起

定義成員函數(shù)

  1. 在類中定義成員函數(shù)
  • 類中定義的成員函數(shù)一般為內(nèi)聯(lián)函數(shù)蹋笼,即使沒(méi)有明確用inline標(biāo)示
  • 在C++中,類定義通常在頭文件中鱼鸠,因此這些成員函數(shù)定義也伴隨著進(jìn)入頭文件
  1. 在類之后定義(一個(gè)類占一個(gè).h配一個(gè).c)
  • C++允許在其它地方定義成員函數(shù)盗忱。
  • 將類定義和其成員函數(shù)定義分開惫周,是目前開發(fā)程序的通常做法颖榜。
  • 我們把類定義(頭文件)看成是類的外部接口叶摄,類的成員函數(shù)定義看成是類的內(nèi)部實(shí)現(xiàn)狈究。
#include<stdio.h>
#include<iostream>
using namespace std;
class Person
{
private:
        int id;
        int money;
public:
      void show();
      void set(int a,int b);
};
void Person::show()
{
    cout<<"id = "<<id<<" money = "<<money<<endl;
}
void Person::set(int a,int b)
{
    if(a<0)
    {
        a=0;
    }
    id=a;
    money=b;
}
int main()
{
    class Person a;
    class Person b;
    a.set(1,1000);
    a.show();
    b.set(2,100);
    b.show();
}

//結(jié)果為: id = 1 money = 1000
//id = 2 money = 100;

#include<iostream>
using namespace std;
class Person
{
private:
        int id;
        int money;
public:
      void show();
      void show(int x);
};
void Person::show()
{
    cout<<"Person show void"<<endl;
}
void Person::show(int x)
{
    cout<<"Person show "<<x<<endl;
}
void show()
{
    cout<<"show void"<<endl;
}
class Test
{   
public:
      void show()
      {
        cout<<"Test show void "<<endl;
      }
};
int main()
{
    class Person a;
    a.show();
    a.show(100);
    class Test b;
    b.show();
}

//結(jié)果為:Person show void
//Person show 100
//Test show void


#include<iostream>
using namespace std;
class Test
{   
public:
      void show()
      {
        cout<<"Test show void "<<endl;
      }
};

void lianxi1(Test *p1)
{
    p1->show();
}
void lianxi2(Test &p2)
{
    p2.show();
}
void lianxi3(Test p3)
{
    p3.show();
}
int main()
{
    Test t;
    lianxi1(&t);
    lianxi2(t);
    lianxi3(t);
}
//結(jié)果為 Test show void
//Test show void
//Test show void

#include<iostream>
using namespace std;
class Test
{   
      int id;
public:
      void setid(int i)
      {
        id=i;
      }
      void show()
      {
        cout<<"this"<<(this)<<endl;
        cout<<"id = "<<this->id<<endl;
      }
};
int main()
{
    Test t;
    t.setid(222);
    t.show();
    cout<<"&t = "<<&t<<endl;
}

//結(jié)果為:this 0x50
//&t = 0x50
//id = 222

封裝(數(shù)據(jù)是私有的,函數(shù)是公有的)

  1. 類的封裝的概念首先是碗淌,數(shù)據(jù)與算法(操作)結(jié)合,構(gòu)成一個(gè)不可分割的整體(對(duì)象)抖锥。
  2. 其次是亿眠,在這個(gè)整體中—些成員是被保護(hù)的,它們被有效地屏蔽磅废,以防外界的干擾和誤操作纳像。
  3. 另一些成員是公共的,它們作為接口提供給外界使用拯勉。而對(duì)該對(duì)象的描述即是創(chuàng)建用戶定義的類型竟趾,對(duì)C++來(lái)說(shuō)憔购,就是類的實(shí)現(xiàn)機(jī)制.

類的作用域

  • 一個(gè)類的所有成員位于這個(gè)類的作用域內(nèi)
    類作用域是類定義和相應(yīng)類成員定義范圍
  • ::前面要加類名

封裝的優(yōu)點(diǎn)

  1. 重用
  2. 不必關(guān)心具體的實(shí)現(xiàn)
  3. 具有安全性

構(gòu)造函數(shù)

  • C++的構(gòu)造函數(shù)和析構(gòu),使得類對(duì)象能夠輕靈地被創(chuàng)建和撤銷
  1. 構(gòu)造函數(shù)創(chuàng)建類對(duì)象岔帽,初始化其成員
  2. 析構(gòu)函數(shù)撤銷類對(duì)象
  3. 構(gòu)造函數(shù)和析構(gòu)函數(shù)是類的特殊成員函數(shù)
  • 類的對(duì)象的初試化只能由類的成員函數(shù)來(lái)進(jìn)行
  1. 建立對(duì)象的同時(shí)玫鸟,自動(dòng)調(diào)用構(gòu)造函數(shù)
  2. 類對(duì)象的定義涉及到一個(gè)類名和一個(gè)對(duì)象名
    由于類的唯一性和對(duì)象的多樣性,用類名而不是對(duì)象名來(lái)作為構(gòu)造函數(shù)名是比較合適的

練習(xí)題

  1. 建立一個(gè)時(shí)鐘,顯示時(shí)間
#include<iostream>
#include<stdlib.h>
#include<unistd.h>
using namespace std;
class Clock
{
    int hour;
    int minute;
    int second;
public:
    void setTime(int h,int m,int s)
    {
        hour=h;
        minute=m;
        second=s;
    }
    void show()
    {
        cout<<hour<<":";
        cout<<minute<<":";
        cout<<second<<endl;
    }
    void tick()
    {
        sleep(1);
        if(second==59&&minute!=59)
        {
            minute=minute+1;
            second=1;
        }
        else if(minute==59&&second==59&&hour!=23)
        {
            hour=hour+1;
            minute=0;
            second=1;
        }
        else if(hour==23&&minute==59&&second==59)
        {
            hour=0;
            minute=0;
            second=1;
        }
        else
        {
            second=second+1;
        }
    }
    void run()
    {
        while(1)
        {
            system("clear");
            show();
            tick();
        }
    }
};
int main()
{
    Clock clock;
    clock.setTime(23,59,50);
    clock.run();        
}

  1. 建立一個(gè)分?jǐn)?shù)
#include<iostream>
using namespace std;
class Fraction
{
    int m;
    int n;
public:
    void setNum(int i,int j)
    {
        m=i;
        n=j;
    }
    void reduce()
    {
        int i;
        int min=m<n?m:n;
        for(i=min;i>0;i--)
        {
            if(m%i==0&&n%i==0)
            {
                break;
            }
        }
        m=m/i;
        n=n/i;
    }
    void show()
    {
        reduce();
        if(m%n==0)
        {
            cout<<"m = "<<m<<endl;
            cout<<"n = "<<n<<endl;
            cout<<"m/n = "<<m<<endl;
        }
        else
        {
            cout<<"m = "<<m<<endl;
            cout<<"n = "<<n<<endl;
            cout<<" m/n = "<<m<<"/"<<n<<endl;
        }
    }
};
int main()
{
    Fraction a;
    int c,b;
    cin>>c>>b;
    a.setNum(c,b);
    a.show();
}

構(gòu)造函數(shù)(析構(gòu)函數(shù)是成員函數(shù))

  • 使得類對(duì)象能夠輕易地被創(chuàng)建和撤銷
#include<iostream>
using namespace std;
class Fract
{
    int m_m;
    int m_z;
public:
      Fract()
      {
        m_m=16;
        m_z=48;
      }
      void set(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      void print()
      {
        reduce();
        cout<<m_z<<"/"<<m_m<<endl;
      }
      void reduce()
      {
        for(int i=m_m;i>0;i--)
        {
            if((m_m%i==0)&&(m_z%i==0))
            {
                m_m/=i;
                m_z/=i;
                break;
            }
        }
      }
};
int main()
{
    Fract a;
    a.print();
}
//沒(méi)有了a.set,結(jié)果為3/1;

  • 第三形態(tài)
#include<iostream>
using namespace std;
class Fract
{
    int m_m;
    int m_z;
public:
      Fract();
      void set(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      void print()
      {
        reduce();
        cout<<m_z<<"/"<<m_m<<endl;
      }
      void reduce()
      {
        for(int i=m_m;i>0;i--)
        {
            if((m_m%i==0)&&(m_z%i==0))
            {
                m_m/=i;
                m_z/=i;
                break;
            }
        }
      }
};
Fract::Fract()
{
    m_m=16;
    m_z=48;
}
int main()
{
    Fract a;
//  a.set(12,16);
    a.print();
}

  • 一步成型
#include<iostream>
using namespace std;
class Fract
{
    int m_m;
    int m_z;
public:
      Fract(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      void set(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      void print()
      {
        reduce();
        cout<<m_z<<"/"<<m_m<<endl;
      }
      void reduce()
      {
        for(int i=m_m;i>0;i--)
        {
            if((m_m%i==0)&&(m_z%i==0))
            {
                m_m/=i;
                m_z/=i;
                break;
            }
        }
      }
};
int main()
{
    Fract f1(10,20);
    f1.print();
    Fract f2(30,5);
    f2.print();
}

  • 成員函數(shù)的重載

#include<iostream>
using namespace std;
class Fract
{
    int m_m;
    int m_z;
public:
      Fract(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      Fract()
      {
        m_m=10;
        m_z=100;
      }
      void set(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      void print()
      {
        reduce();
        cout<<m_z<<"/"<<m_m<<endl;
      }
      void reduce()
      {
        for(int i=m_m;i>0;i--)
        {
            if((m_m%i==0)&&(m_z%i==0))
            {
                m_m/=i;
                m_z/=i;
                break;
            }
        }
      }
};
int main()
{
    Fract f1(10,20);
    f1.print();
    Fract f2;
    f2.print();
}

  • 數(shù)組
#include<iostream>
using namespace std;
class Fract
{
    int m_m;
    int m_z;
public:
      Fract(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      Fract()
      {
        m_m=10;
        m_z=100;
        cout<<"Fract construct"<<endl;
      }
      void set(int m,int z)
      {
        m_m=m;
        m_z=z;
      }
      void print()
      {
        reduce();
        cout<<m_z<<"/"<<m_m<<endl;
      }
      void reduce()
      {
        for(int i=m_m;i>0;i--)
        {
            if((m_m%i==0)&&(m_z%i==0))
            {
                m_m/=i;
                m_z/=i;
                break;
            }
        }
      }
};
int main()
{
    Fract f2[5];
}

//結(jié)果為:Fract construct
//Fract construct
//Fract construct
//Fract construct
//Fract construct

定義對(duì)象

對(duì)象的初始化

  1. 建立對(duì)象犀勒,須有一個(gè)有意義的初始值
    C++建立和初始化對(duì)象的過(guò)程專門由該類的構(gòu)造函數(shù)來(lái)完成屎飘。
  2. 構(gòu)造函數(shù)給對(duì)象分配空間和初始化。
  3. 如果一個(gè)類沒(méi)有專門定義構(gòu)造函數(shù)贾费,那么C++就僅僅創(chuàng)建對(duì)象而不做任何初始化
  • 每一個(gè)類都要保證要有一個(gè)無(wú)參的構(gòu)造函數(shù)
#include<iostream>
using namespace std;
class A
{   
public:
    A()
    {
        cout<<"A construct"<<endl;
    }
};
class Test
{
    A m_t;
public:
    Test()
    {
        cout<<"Test construct"<<endl;
    }
};
int main()
{
    Test t;

}

//結(jié)果為:Aconstruct
//Test construct

  • 一個(gè)類中的成員函數(shù)包含另一個(gè)類中的構(gòu)造函數(shù),則再創(chuàng)建類的空間時(shí),都會(huì)創(chuàng)建
#include<iostream>
using namespace std;
class A
{
    int m_a;
public:
    A(int a)
    {
        m_a=a;
        cout<<"A construct "<<m_a<<endl;
    }
};
class Test
{
    A m_t;
public:
    Test():m_t(222)
    {
        cout<<"Test construct"<<endl;
    }
};
int main()
{
    Test t;

}

//結(jié)果為:A construct 222
//Test construct

#include<iostream>
using namespace std;
class A
{
    int m_a;
public:
    A(int a)
    {
        m_a=a;
        cout<<"A construct "<<m_a<<endl;
    }
    A()
    {
    }
};
class Test
{
    A m_t1;
public:
    Test():m_t1()
    {
        cout<<"Test construct"<<endl;
    }
};
int main()
{
    Test t;

}
//結(jié)果為:Test construct

  • 當(dāng)含有多個(gè)成員變量時(shí)
#include<iostream>
using namespace std;
class A
{
    int m_a;
public:
    A(int a)
    {
        m_a=a;
        cout<<"A construct "<<m_a<<endl;
    }
};
class Test
{
    A m_t2;
    A m_t1;
public:
    Test():m_t1(111),m_t2(222)
    {
        cout<<"Test construct"<<endl;
    }
};
int main()
{
    Test t;

}

//結(jié)果為:A construct222
//A construct111
//Test construct

析構(gòu)函數(shù)(有且只有一個(gè))

#include<iostream>
using namespace std;
class A
{
    int m_a;
public:
    A(int a)
    {
        m_a=a;
        cout<<"A construct "<<a<<endl;
    }
};
class Test
{
    A m_t1;
    A m_t2;
public:
    Test():m_t2(222),m_t1(111)
    {
        cout<<"Test construct"<<endl;
    }
    ~Test()
    {
        cout<<"~~~~~~Test"<<endl;
    }
};
int main()
{
    Test t;
    cout<<"=========="<<endl;
}

//結(jié)果為:A construct 111
//A construct 222
//Test construct
//=================
//~~~~~~Test(在t消亡后才運(yùn)行)

#include<iostream>
using namespace std;
class A
{
    int m_a;
public:
    A(int a)
    {
        m_a=a;
        cout<<"A construct "<<a<<endl;
    }
    ~A()
    {
        cout<<"~~~~~~A "<<m_a<<endl;
    }
};
class Test
{
    A m_t1;
    A m_t2;
public:
    Test():m_t2(222),m_t1(111)
    {
        cout<<"Test construct"<<endl;
    }
    ~Test()
    {
        cout<<"~~~~~~Test"<<endl;
    }
};
int main()
{
    Test t;
    cout<<"=========="<<endl;
}
//結(jié)果為:A construct 111
//A construct 222
//Test construct
//=================
//~~~~~~Test
//~~~~~~A 222
//~~~~~~A 111

#include<iostream>
#include<malloc.h>
using namespace std;
class Test
{
    int *p;
public:
    Test()
    {
        p=(int *)malloc(sizeof(int));
        *p=4;
        cout<<"Test construct "<<endl;
    }
    ~Test()
    {
        free(p);
        cout<<"~~~~~~~Test"<<endl;
    }
    void print()
    {
        cout<<*p<<endl;
    }
};
int main()
{
    Test t;
    t.print();
    cout<<"========="<<endl;
}

//結(jié)果為:Test construct
//4
//======================
//~~~~~~~~Test

  • 構(gòu)造函數(shù)在分配空間之后調(diào)用

bool

#include<iostream>
using namespace std;
int main(int argc,char **argv)
{
    bool bSex=true;
    cout<<"請(qǐng)輸入性別:";
    cin>>bSex;
    cout<<"我叫Jack,是一位"<<(bSex?"帥鍋":"美女")<<endl;
    cout<<"true = "<<true<<endl;
    cout<<"false = "<<false<<endl;
    
}

#include<iostream>
using namespace std;
int main()
{
    string s;//string s("weiwei");//string s1(5,'a');//string s(s1);
    s="hello shangqian!";//1.賦值
    s+="sq1409";//2.追加/連接
//  s="hello";
//  s.clear();//清空
    cout<<"size = "<<s.size()<<endl;//求長(zhǎng)度
    cout<<"s是否為空"<<(s.empty()?"空":"非空")<<endl;
    cout<<"s = "<<s<<endl;
    //string類型和char *類型的轉(zhuǎn)換
    const char *buf=s.c_str();
    cout<<"buf = "<<buf<<endl;
    //字符串比較钦购,可以直接用比較運(yùn)算符//== != > <
    if(s=="hello")
    {
        cout<<"s == hello"<<endl;
    }
    //查看某個(gè)位置上的字符//at()越界訪問(wèn) 會(huì)拋出異常//[]不會(huì)
    cout<<"s[3] = "<<s[3]<<endl;
//  cout<<"s[4] = "<<s.at(4)<<endl;//可以通過(guò)異常捕捉
    return 0;
    
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铸本,一起剝皮案震驚了整個(gè)濱河市肮雨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箱玷,老刑警劉巖怨规,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锡足,居然都是意外死亡波丰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門舶得,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掰烟,“玉大人,你說(shuō)我怎么就攤上這事沐批∪移铮” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵九孩,是天一觀的道長(zhǎng)先馆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)躺彬,這世上最難降的妖魔是什么煤墙? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮宪拥,結(jié)果婚禮上仿野,老公的妹妹穿的比我還像新娘。我一直安慰自己她君,他們只是感情好脚作,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缔刹,像睡著了一般鳖枕。 火紅的嫁衣襯著肌膚如雪魄梯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天宾符,我揣著相機(jī)與錄音酿秸,去河邊找鬼。 笑死魏烫,一個(gè)胖子當(dāng)著我的面吹牛辣苏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哄褒,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼稀蟋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了呐赡?” 一聲冷哼從身側(cè)響起退客,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎链嘀,沒(méi)想到半個(gè)月后萌狂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怀泊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年茫藏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹琼。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡务傲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枣申,到底是詐尸還是另有隱情售葡,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布忠藤,位于F島的核電站挟伙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熄驼。R本人自食惡果不足惜像寒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一烘豹、第九天 我趴在偏房一處隱蔽的房頂上張望瓜贾。 院中可真熱鬧,春花似錦携悯、人聲如沸祭芦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)龟劲。三九已至胃夏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昌跌,已是汗流浹背仰禀。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚕愤,地道東北人答恶。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像萍诱,于是被迫代替她去往敵國(guó)和親悬嗓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • C++基礎(chǔ) 類和構(gòu)造函數(shù) 類 類:類是定義同一類所有對(duì)象得變量和方法的藍(lán)圖或原型裕坊。數(shù)據(jù)與算法的統(tǒng)一包竹。成員成員函數(shù)保...
    I踏雪尋梅閱讀 264評(píng)論 0 1
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out籍凝。 檢查...
    SeanC52111閱讀 2,794評(píng)論 0 3
  • 本文博客園地址:http://www.cnblogs.com/xiongxuanwen/p/4290086.htm...
    先之閱讀 842評(píng)論 0 5
  • 本章將會(huì)介紹 存儲(chǔ)屬性的初始賦值自定義構(gòu)造過(guò)程默認(rèn)構(gòu)造器值類型的構(gòu)造器代理類的繼承和構(gòu)造過(guò)程可失敗構(gòu)造器必要構(gòu)造器...
    寒橋閱讀 770評(píng)論 0 0
  • 窗外雨聲唏嘩 輕一下重一下 天邊陰云游弋 四地?zé)熁\霧起 你在街上是嗎 記得帶傘了嗎 回憶如潮回起 舊事美妙無(wú)比 大...
    deepspring99閱讀 276評(píng)論 0 2