天天看點

C++部分——C++面向對象(1)

1.描述面向對象技術的基本概念

面向對象是人們認識客觀世界的系統思維方式,采用基于對象(實體)的概念建立模型,模拟客觀世界分析,設計,實作軟體的方法,包括類,對象,消息以及類的特性等方面的内容。

2.C++與C語言相比的改進

C++是從C語言發展演變的。C語言是過程式程式設計語言,它以過程為中心,以算法為驅動。而C++能夠使用面向對象的程式設計方式,即使用以面向對象為中心,以消息為驅動的程式設計方式。這是C++在C語言上面的最大改進。

3.class和struct有什麼差別

分為以下兩種情況:

C語言的struct與C++的class的差別:struct隻是作為一種複雜資料類型定義,不能用于面向對象程式設計;

C++中的struct與class的差別:對于成員通路權限以及繼承方式,class中預設的是private的,而struct中則是public的。class還可以用于表示模闆類型,struct則不行。

4.改錯——C++類對象的聲明

struct Test
{
     Test(int){}
     Test(){}
     void fun(){}
};
void main(void)
{
    Test a();
    a.fun();
    Test b();
    b.fun();
}
           

題中的Test有兩個構造函數,其中一個是帶參數的,而另一個是不帶參數的。在調用不帶參數的構造函數時不需要加小括号,是以代碼第12行是錯誤的。應該改成:

Test b;//去掉小括号

5.看代碼寫結果——C++類成員的通路

(類對象的私有成員函數不能用對象通路)

#define public private   //(1)
class Animal
{
public :                 //(2)
    void MakeNoise();
};
int main(void)
{
    Animal animal;
    animal.MAkeNoise();//(3)
    return ;
}
           

(1)正确。把public宏定義為private;

(2)正确。定義public成員。注意,由于public已經被定義為private,是以這裡的MakeNoise()成員函數實際上是private。

(3)錯誤。調用Animal對象的私有成員函數。

6.找錯——類成員的初始化

#include<iostream>
using namespace std;
class Obj{
public :
    Obj(int k):j(k),i(j);
    {
    }
    void printf(void)
    {
        cout<<i<<endl<<j<<endl;
    }
private:
    int i;
    int j;
};
int main(int argc,char *argv[])
{
    Obj obj();
    obj.print();

    return ;
}
           

本題考查的是初始化清單方面的知識。這裡很容易讓人以為先用2對j進行初始化,然後用j對i進行初始化,那麼i和j都是2.

實際上,初始化的順序正好與想象的相反。初始化清單的初始化順序與變量聲明的順序一緻,而不是按照出現在初始化清單中的順序。這裡的成員i比成員j先聲明,是以正确的順序是先用j對i進行初始化,然後用2對j進行初始化。由于在對i進行初始化時j尚未被初始化,j的值為随機值,故i的值也為随機值;然後用2對j進行初始化,j的值為2.

7.靜态成員變量的使用(看代碼,寫結果)

#include<iostream>
using namespace std;
class Myclass
{
public :
    Myclass(int a,int b,int c);
    void GetNumber();
    void GetSum();
private:
    int A;
    int B;
    int C;
    int Num;
    static int Sum;
};

int Myclass::Sum=;

Myclass::Myclass(int a,int b,int c)
{
    A=a;
    B=b;
    C=c;
    Num=A+B+C;
    Sum=A+B+C;
}
void Myclass::GetNumber()
{
    cout<<"Number="<<Num<<endl;
}
void Myclass::GetSum()
{
    cout<<"Sum="<<Sum<<endl;
}

void main()
{
    Myclass M(,,),N(,,);

    M.GetNumber();
    N.GetNumber();
    M.GetSum();
    N.GetSum();
}
           

本題考查的是靜态成員與非靜态成員的差別。靜态成員被當作該類類型的全局變量。對于非靜态成員,每個類對象都有自己的複制品,而靜态成員對每個類的類型隻有一個複制品。靜态成員隻有一份,由該類類型的所有對象共享通路。

MyClass類中有GetNumber()和GetSum()兩種方法,它們分别輸出成員變量Num和Sum的值。main函數中定義了兩個Myclass的對象,并調用它們的GetNumber()和GetSum()方法。

Num成員為普通類型,它為Myclass類的對象所有。因為兩次列印的值不一樣。

Sum成員為靜态類型,它為Myclass類所有,被Myclass類的所有對象共享。是以,兩次列印出來的值是相同的。

答案如下:

Number=20

Number=34

Sum=34

Sum=34

8.與全局對象相比,使用靜态資料成員有什麼優勢

優勢如下:*1.靜态資料成員沒有進入程式的全局名字空間,是以不存在程式中其他全局名字沖突的可能性;

*2.使用靜态資料成員可以隐藏資訊。是以靜态成員可以是private成員,而全局對象不能。

繼續閱讀