天天看點

(9)C++ 對象和類

一、類 

1.通路控制

class student {
    int age;//預設私有控制
public:
    string name;
    double weight;
};      

2.成員函數

  • 定義成員函數時,使用::辨別函數所屬的類
  • 類方法可以通路類的private元件

成員函數聲明與普通函數相同,定義時分類外定義和類内定義

類内定義,在類中聲明的函數都是預設都是内聯函數(加上inline)

#include<iostream>
using namespace std;
class student {
public:
    int sum(int a, int b) {
        return a + b;
    }
};

void main() {
    student stu;//建立對象
    int a=stu.sum(3, 4);
    cout << a << endl;
}      

類外定義

#include<iostream>
using namespace std;
class student {
public:
    int sum(int a,int b);//函數聲明
};

inline int student::sum(int a, int b) {//類外定義
    return a + b;
}

void main() {
    student stu;//建立對象
    int a=stu.sum(3, 4);
    cout << a << endl;
}      

再強調下内聯函數的作用:内聯函數和普通函數的差別在于:當編譯器處理調用内聯函數的語句時,不會将該語句編譯成函數調用的指令,而是直接将整個函數體的代碼插人調用語句處,就像整個函數體在調用處被重寫了一遍一樣。有了内聯函數,就能像調用一個函數那樣友善地重複使用一段代碼,而不需要付出執行函數調用的額外開銷。很顯然,使用内聯函數會使最終可執行程式的體積增加。以時間換取空間,或增加空間消耗來節省時間,這是計算機學科中常用的方法 。

二、構造函數和析構函數

 1.構造函數

為了隐藏資料,并且在建立時進行初始化,創造了構造函數的功能.

(1)使用帶參構造函數

#include<iostream>
using namespace std;
class student {
    int m_a = 1;
    int m_b = 1;
public:
    student() {

    }//預設構造函數
    student(int a, int b) {
        m_a = a;
        m_b = b;
    }//帶參構造函數
    int sum() {
        return m_a + m_b;
    };
};

void main() {
    student stu1 = student{1,1};//1.顯示調用構造函數
    int a1 = stu1.sum();
    cout <<"顯示調用構造函數 "<< a1 << endl;

    student stu2 ( 2,2 );//2.隐式調用構造函數
    int a2= stu2.sum();
    cout << "隐式調用構造函數 " << a2 << endl;


    student *stu3 = new student(3, 3);//3.動态調用構造函數
    int a3=stu3->sum();
    cout << "動态調用構造函數 " << a3 << endl;
}      

(2)預設構造函數

class student {
public:
    student() {
        cout << "調用構造函數"<< endl;
    }
};

void main() {
    //調用預設構造函數的幾種方式
    student stu1;
    student stu2= student();
    student *stu3 = new student;
}      

注意

student stu1();//這是一個傳回student對象的函數,而不是構造函數      

 c++11 清單初始化

student stu1 = { 3,5 };      

2.析構函數

#include<iostream>
using namespace std;
class student {
public:
    student() {
        cout << "調用構造函數"<< endl;
    }
    ~student() {
        cout << "調用析構函數" << endl;
    }
};

void main() {
    {
        student stu1;//這是一個傳回student對象的函數,而不是構造函數
    }
}      

3.const成員函數 

const成員函數内不運作修改成員屬性,被添加mutable的成員函數可以被const函數修改

void sum(int &a,int b) const {//const放在方法的後面,使得該程式下成員函數不能被修改
    a = 200;
}      

const指針修飾的是被隐藏的this指針所指向的記憶體空間,修飾的是this指針

三、this指針

this指針指向被調用的成員函數所屬的對象。

this指針隐含每一個非靜态成員函數内的指針。

用途:

  this 同名參數

  類的非靜态成員函數中傳回對象本身,可用return *this

四、對象數組

五、類作用域

六、抽象資料類型