C++復習 選擇題


答案不一定准確
2-1若有以下語句:static char x[ ]="12345"; static char y[ ]= {'1','2','3','4','5'};
則正確的說法是()。
(2分)
A.x數組和y數組的長度相同
B.x數組的長度大於y數組的長度
C.x數組的長度小於y數組的長度
D.x數組與y數組等價
 
答案:B x[5]='\0'
 
2-2在聲明語句int *fun();時,fun表示()。
(2分)
A.一個用於指向函數的指針變量
B.一個返回值為指針型的函數名
C.一個用於指向一維數組的行指針
D.一個用於指向int型數據的指針變量
 
答案:B
 
2-3對於指針的運算,下列說法()是錯誤的。
(2分)
A.可以用一個空指針賦值給某個指針
B.一個指針可以加上一個整數
C.兩個指針可以進行加法運算
D.兩個指針在一定條件下,可以進行相等或不相等的運算
 
答案:C 指針值就是地址,兩個地址相加在任何時候都沒有意義。
A)可用空指針賦值給某個指針實現初始化操作
B)當指針指向數組時,指針加上一個整數表明基於當前位置向后移動的元素個數
D)兩個指針指向同一個數組,就可以進行相等運算,還可以比較大小
 
2-4若有語句:char *line[6];以下敘述中正確的是()。
(2分)
A.定義line是一個數組,每個數組元素是一個基類型為char為指針變量
B.定義line是一個指針變量,該變量可以指向一個長度為6的字符型數組
C.定義line是一個指針數組,語句中的*號稱為間址運算符
D.定義line是一個指向字符型函數的指針
 
答案:A 由於運算符[]優先級比*高,所以line是一個數組,每個數組元素是一個基類型為char的指針變量。
 
2-5對語句float(*pf)(float x)的描述,正確的是()。
(2分)
A.一個用於指向函數的指針變量
B.一個返回值為指針型的函數名
C.一個用於指向float型數據的指針數組
D.一個用於指向float型數據的指針變量
 
答案:A
 
2-6關於類和對象不正確的說法是:()。
(2分)
A.類是一種類型,它封裝了數據和操作
B.對象是類的實例
C.一個類的對象只有一個
D.一個對象比屬於某個類
 
答案:明顯C 一個類可以聲明多個對象。
 
2-7下列各類函數中,不是類的成員函數的是:
(2分)
A.構造函數
B.析構函數
C.友元函數
D.拷貝構造函數

答案:C
  構造函數包括默認構造函數和拷貝構造函數等,析構函數和構造函數一樣屬於類的特殊的成員函數。而友元函數則是為了增加類的訪問靈活性而允許其他類的成員函數或全局函數訪問類的內部變量或成員函數的一種機制,其缺點是破壞了類的封裝性。
 
 2-8在C++中實現封裝是借助於()。
(2分)
A.枚舉
B.類
C.數組
D.函數
 
答案:B
  此題考查的是C++語言中對象概念的理解。所謂封裝性是指將數據和算法捆綁成一個整體,這個整體就是對象。C++語言通過建立用戶定義類型“類”來支持封裝性和信息隱藏。
 
2-9在面向對象方法中,不屬於“對象”基本特點的是()。
(2分)
A.一致性
B.分類性
C.多態性
D.標識唯一性
 
答案:A 對象有如下一些基本特點:標識唯一性、分類性、多態性、封裝性、模塊獨立性好。所以選擇A。
 
2-10對類的構造函數和析構函數描述正確的是( )。
(2分)
A.構造函數可以重載,析構函數不能重載
B.構造函數不能重載,析構函數可以重載
C.構造函數可以重載,析構函數也可以重載
D.構造函數不能重載,析構函數也不能重裁
 
答案:A
  一個類中只能定義一個析構函數,否則會造成對同一對象的多次 刪除;而構造函數可以根據不同的參數個數和類型進行多次重載。
 
2-11( )是給對象取了一個別名,它引入了對象的同義詞。
(2分)
A.結構
B.枚舉
C.指針
D.引用
答案:D
 
2-12在一個函數中,要求通過函數來實現一種不太復雜的功能,並且要求加快執行速度,選用()。
(2分)
A.內聯函數
B.重載函數
C.遞歸調用
D.嵌套調用

答案:A
  內聯inline函數就是取代宏定義的,在編譯時展開,插入到相應的位置,從而減少了系統開銷,加快了執行速度。虛函數則是為了取消二義性現象,靜態函數則是一個類所有對象的共享函數。
 
2-13如果有int x,*p;float y,*q;,則下面操作正確的是()。
(2分)
A.p=x
B.p=q
C.p=&x
D.p=&y
 
答案:C
 
2-14若定義:string str; 當語句cin>>str; 執行時,從鍵盤輸入: Microsoft Visual Studio 6.0! 所得的結果是str=( )。
(2分)
A.Microsoft Visual Studio 6.0!
B.Microsoft
C.Microsoft Visual
D.Microsoft Visual Studio 6.0
 
答案:B
 
2-15假定AA為一個類,a()為該類公有的函數成員,x為該類的一個對象,則訪問x對象中函數成員a()的格式為()。
(2分)
A.x.a
B.x.a()
C.x->a
D.(*x).a()
 
答案:B
 
2-16關於對象概念的描述中,說法錯誤的是()。
(2分)
A.對象介紹c語言中的結構變量
B.對象代表着正在創建的系統中的一個實體
C.對象是類的一個變量
D.對象之間的信息傳遞是通過消息進行的
 
答案:A
 
2-17(2018final) 如果默認參數的函數聲明為“void fun(int a, int b=1, char c='a', double d=3.2);”, 則下面調用寫法正確的是( )。
(2分)
A.fun();
B.fun(2,3);
C.fun(2, ,'c', 3.14)
D.fun(int a=1);
 
答案:B
 
2-18現有類的定義如下:

class MyClass {
public:
    MyClass(int x): val(x) {}
    void Print() const {cout << "const:val=" << val << '\t';}
    void Print() {cout << "val=" << val << '\t';}
private:
    int val;
};

在main函數中定義該類的l兩個對象:const MyClass obj1(10); MyClass obj2(20); 依次執行obj1.Print(); obj2.Print();的輸出結果是()。
(2分)
A.val=10 const:val=20
B.const:val=10 const:val=20
C.const:val=10 val=20
D.val=10 val=20

答案:C
 
 2-19關於this指針的描述中,錯誤的是()。
(2分)
A.this指針是指向對象的指針
B.this指針是在使用對象引用成員函數時,系統自動生成的
C.this指針可以在程序中顯示使用
D.this指針是指向成員函數的指針
 
答案:D
 
2-20在下面有關靜態成員函數的描述中,正確的是()。
(2分)
A.在建立對象前,就可以為靜態數據成員賦值
B.靜態成員函數在類外定義時要用static前綴
C.靜態成員函數只能在類外定義
D.在靜態成員函數中可以使用this指針

答案:A
 
2-21對於以下關於友元的說法
(2分)
A.如果函數fun被聲明為類A的友元函數,則該函數成為A的成員函數
B.如果函數fun被聲明為類A的友元函數,則該函數能訪問A的保護成員,但不能訪問私有成員
C.如果函數fun被聲明為類A的友元函數,則fun的形參類型不能是A。
D.以上答案都不對
 
答案:D

A.友元函數是指某些雖然不是類成員函數卻能夠訪問類的所有成員的函數。

B.類授予它的友元特別的訪問權,這樣該友元函數就能訪問到類中的所有成員。

C.如果函數fun被聲明為類A的友元函數,則fun的形參類型可以是A。

 

2-22下面關於友元的描述中,錯誤的是:
(2分)
A.友元函數可以訪問該類的私有數據成員
B.一個類的友元類中的成員函數都是這個類的友元函數
C.友元可以提高程序的運行效率
D.類與類之間的友元關系可以繼承

答案:D 友元關系不能被繼承

 

2-23已知類A是類B的友元,類B是類C的友元,則:
(2分)
A.類A一定是類C的友元
B.類C一定是類A的友元
C.類C的成員函數可以訪問類B的對象的任何成員
D.類A的成員函數可以訪問類B的對象的任何成員

答案:D

A.B友元關系不具有傳遞性。若類A是類B的友元,類B是C的友元,類A不一定是類C的友元,同樣要看類中是否有相應的申明。

C.D友元關系是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的聲明。

 

2-25若類A被說明成類B的友元,則( ) 。
(2分)
A.類A的成員即類B的成員
B.類B的成員即類A的成員
C.類A的成員函數不能訪問類B的成員
D.類B不一定是類A的友元

答案:D

 

2-26下列的模板說明中,正確的是。
(2分)
A.template < typename T1, T2 >
B.template < class T1, T2 >
C.template < typename T1, typename T2 >
D.template ( typedef T1, typedef T2 )

答案:C

 

2-27假設有函數模板定義如下:  template  Max( T a, T b ,T &c) { c = a + b ; } 下列選項正確的是( )。
(2分)
A.int x, y; char z ;Max( x, y, z ) ;
B.double x, y, z ;Max( x, y, z ) ;
C.int x, y; float z ;Max( x, y, z );
D.float x; double y, z;Max( x, y, z ) ;

答案:B

 

2-28關於類模板,描述錯誤的是。
(2分)
A.一個普通基類不能派生類模板
B.類模板可以從普通類派生,也可以從類模板派生
C.根據建立對象時的實際數據類型,編譯器把類模板實例化為模板類
D.函數的類模板參數需生成模板類並通過構造函數實例化

答案:A

A

 

#include<bits/stdc++.h>
using namespace std;
class student {
    protected:
        string name;
        int sco;
    public:
        student(string na,int sc){
            name=na;
            sco=sc;
        }
};

template<class T>
class stu1:public student{
    protected:
        T num;
    public:
        stu1(string na, int sc, T nu):student(na,sc){
            num=nu;
        }
        void display(){
            cout<<name<<" "<<sco<<" "<<num;
        }
}; 
    
int main() {
    string na="lihua";
    int sc=1;
    int a=2;
    stu1 <int>st(na,sc,a);
    st.display();
    return 0;
}

 

B

#include<bits/stdc++.h>
using namespace std;

template<class T>
class Animal {
    public:
        void Jiao() {
            cout << mAge << "歲的動物在叫!" << endl;
        }
    public:
        T mAge;
};

template<class T>
class Cat :public Animal<T> {
    };
int main()
{
    int age=1;
    Cat <int>c;
    c.mAge=age;
    c.Jiao();
    return 0;
}

 

C D 

"一般來講,類模版是結構相似但不同的類的抽象,是描述性的;形式:template<typename   T>   class   類版名;模版類是   類模版鑄造出來的類,是具體的類,是如結構等相似的類型;"  

類模板只是一個抽象的描述,在應用時在內存中是不占空間的,  
  而模板類是一個具體的東西!

 

2-30下列關於模板的說法中,錯誤的是____。
(2分)
A.用模板定義一個對象時,不能省略參數
B.類模板只能有虛擬參數類型
C.類模板的成員函數都是模板函數
D.類模板在編繹中不會生成任何代碼

答案:C

 

2-31(2018final) 下面對模板的聲明,正確的是( )。
(2分)
A.template<T>
B.template<class T1, T2>
C.template<class T1, class T2>
D.template<class T1; class T2>

答案:C

 

2-32在c++中,類之間的繼承關系具有( )。
(2分)
A.自反性
B.對稱性
C.傳遞性
D.反對稱性

答案:C

 

2-33下列關於類的繼承描述中,( )是正確的。
(2分)
A.派生類公有繼承基類時,可以訪問基類的所有數據成員,調用所有成員函數。
B.派生類也是基類,所以它們是等價的。
C.派生類對象不會建立基類的私有數據成員,所以不能訪問基類的私有數據成員。
D.一個基類可以有多個派生類,一個派生類可以有多個基類。

答案:D

 

2-34下列關於運算符重載的描述中,( )是正確的。
(2分)
A.運算符重載可以改變操作數的個數
B.運算符重載可以改變優先級
C.運算符重載可以改變結合性
D.運算符重載不可以改變語法結構

答案:D

 

2-35為了能出現在賦值表達式的左右兩邊,重載的"[]"運算符應定義為:
(2分)
A.A operator [ ] (int);
B.A& operator [ ] (int);
C.const A operator [ ] (int);
D.以上答案都不對

答案:B

 

 2-36關於類的靜態數據成員和靜態函數成員,說法錯誤的是( )
(2分)
A.類的靜態數據成員,解決的是同類不同對象之間的數據共享問題。
B.類的靜態數據成員,具有靜態聲明周期,必須在命名空間作用域的某個地方對其進行初始化。
C.靜態成員函數可以直接訪問該類的靜態數據成員和函數成員;而訪問類的非靜態成員,必須通過對象名。
D.靜態數據成員,屬於對象的屬性。若要對靜態數據成員進行訪問,必須通過對象名。

 答案:D

靜態數據成員是類的所有對象共享的成員,即可以通過類名訪問,也可以通過對象訪問。但通過類名訪問更方便、更高效。

#include<bits/stdc++.h>
using namespace std;
class A {
    public:
        static int x;
};

int A::x=3;

int main() {
    A a;
    cout << a.x << endl;
    cout << A::x << endl;
    return 0;
}

 

 

2-37下列關於運算符重載的表述中,正確的是()。
(2分)
A.C++已有的任何運算符都可以重載
B.運算符函數的返回類型不能聲明為基本數據類型
C.在類型轉換符函數的定義中不需要聲明返回類型
D.可以通過運算符重載來創建C++中原來沒有的運算符

 答案:C

  重載運算符的規則如下:①C++不允許用戶自己定義新的運算符,只能對已有的C++運算符進行重載;②C++不能重戟的運算符只有5個;③重載不能改變運算符運算對象的個數;④重載不能改變運算符的優先級和結合性;⑤重載運算符的函數不能有默認的參數;⑥重載的運算符必須和用戶定義的自定義類型的對象一起使用,至少應有一個是類對象,即不允許參數全部是C++的標准類型。故本題答案為C。

 

2-38下列關於運算符重載的描述中,( )是正確的。
(2分)
A.針對<<、>>運算符不可以采用友元函數進行重載
B.針對<<、>>運算符既可以采用成員函數也可以采用友元函數進行重載
C.AB說法均正確
D.ABC均不正確

 答案:D

只能將重載<<、>>的函數作為友元函數,而不能將它們定義為成員函數

 

2-39如何區分自增運算符重載的前置形式和后置形式?
(2分)
A.重載時,前置形式的函數名是++operator,后置形式的函數名是operator ++
B.后置形式比前置形式多一個 int 類型的參數
C.無法區分,使用時不管前置形式還是后置形式,都調用相同的重載函數
D.前置形式比后置形式多一個 int 類型的參數

 答案:B

 

2-40系統在調用重載函數時往往根據一些條件確定哪個重載函數被調用,在下列選項中,不能作為依據的是( )。
(2分)
A.函數的返回值類型
B.參數的類型
C.函數名稱
D.參數個數

 答案:A

 

2-41在派生類對基類繼承的傳遞性中,__是錯誤的。
(2分)
A.在公有繼承方式下,直接派生類對象可以直接調用基類中的公有成員函數,去訪問基類的私有數據成員
B.在公有繼承方式下,間接派生類對象可以直接調用基類中的公有成員函數,去訪問基類的私有數據成員
C.在私有繼承方式下,間接派生類對象可以直接調用基類中的公有成員函數,去訪問基類的私有數據成員
D.不管是私有繼承還是公有繼承,基類中的私有成員在派生類的作用域內都是不可能見的。
答案:C

 

應該是這個意思吧

#include<bits/stdc++.h>
using namespace std;
class A {
    private:
        int a; 
    public:
        void set_a(int aa){
            a=aa;
        }
        int get_a(){
            return a; 
        }
};

//  A選項 
//class B:public A{
//    public:
//        void zz(){
//            get_a();
//        }
//};


//  B選項 
//class B:public A{
//    public:
//        void zz(){
//            get_a();
//        }
//};
//class C:public B{
//    public:
//        void zz(){
//            get_a();
//        }
//};


//  C選項 
class B:private A{
    public:
        void zz(){
            get_a();
        }
};
class C:private B{
    public:
        void zz(){
            get_a();
        }
};

int main() {
    return 0;
}

 

 

 

2-42在C++語言中設置虛基類的目的是( ) 。
(2分)
A.簡化程序代碼
B.提高程序的運行效率
C.解決多繼承造成的二義性問題
D.縮短程序的目標代碼

 答案:C

  虛基類的目標就是要消除二義性。盡管:C++或其他OO語言支持多重繼承,但在實際軟件開發中多重繼承用的並不多,原因在於多重繼承過手復雜。因此,在C#中已經不再支持多重繼承了。

 

2-43繼承機制的作用是
(2分)
A.信息隱藏
B.數據封裝
C.定義新類
D.數據抽象
答案:C

 

2-44C++語言類體系中, 不能被派生類繼承的有
(2分)
A.轉換函數
B.構造函數
C.虛函數
D.靜態成員函數

 答案:B

  派生類對象的數據結構是由基類中說明的數據成員和派生類中說明的數據成員共同構成,所以不能繼承基類的構造函數,必須重新定義。

 

2-45在公有繼承的情況下,在派生類中能夠訪問的基類成員包括
(2分)
A.公有成員
B.保護成員
C.公有成員、保護成員和私有成員
D.公有成員和保護成員

 答案:D

 

2-46可以用p.a的形式訪問派生類對象p的基類成員a, 其中a是
(2分)
A.私有繼承的公有成員
B.公有繼承的私有成員
C.公有繼承的保護成員
D.公有繼承的公有成員

 答案:D

 

2-47下面關於繼承和派生的構造函數和析構函數的程序,輸出結果是

#include<iostream>
using namespace std;
class AA {
public:
    AA() { cout << "A"; }
    ~AA() { cout << "a"; }
};
class BB: public AA {
    AA aa;
public:
    BB() { cout << "B"; }
    ~BB() { cout << "b"; }
};
int main() {
    BB bb;
    return 0;
}

(2分)
A.AABaab
B.AABbaa
C.BAAaab
D.BAAbaa

 答案:B

 

 

2-48一個類的私有成員
(2分)
A.只能被該類的成員函數訪問
B.只能被該類的成員函數和友元函數訪問
C.只能被該類的成員函數、友元函數和派生類訪問
D.以上答案都不對

 答案:B

  派生類中父類的私有成員為不可訪問。

 

2-49建立派生類對象時, 3種構造函數分別是a(基類的構造函數)、b(成員對象的構造函數)、c(派生類的構造函數),這3種構造函數的調用順序為
(2分)
A.abc
B.acb
C.cab
D.cba

 答案:A

基類的構造函數------>成員對象的構造函數------>派生類的構造函數

派生類的析構函數------>成員對象的析構函數------>基類的析構函數

 

2-50下面敘述不正確的是
(2分)
A.基類的保護成員在派生類中仍然是保護的成員
B.基類的保護成員在公有派生類中仍然是保護的
C.基類的保護成員在私有派生類中仍然是私有的
D.對基類成員的訪問必須是無二義性

 答案:A

 

2-51下面關於類的繼承與派生的程序,其輸出結果是

#include<iostream>
using namespace std;
class A
{
public:
    A(){cout<<"A";}
};
class B
{
public:
    B(){cout<<"B";}
};
class C:public A
{
    B b;
public:
    C(){cout<<"C";}
};
int main(){
    C obj;
    return 0;
}

(2分)
A.CBA
B.BAC
C.ACB
D.ABC

 答案:D

基類的構造函數------>成員對象的構造函數------>派生類的構造函數 

 

2-52假設在公有派生情況下,以下說法不正確的是
(2分)
A.可以將基類對象復制給派生類對象
B.可以將派生類對象的地址復制給基類指針
C.可以將派生類對象賦值給基類的引用
D.可以將派生類對象賦值給基類對象

 答案:A

 

2-53下列關於派生類構造函數和析構函數的說法中,錯誤的是
(2分)
A.派生類的構造函數會隱含調用基類的構造函數
B.如果基類聲明了帶有形參表的構造函數,則派生類就應當聲明構造函數
C.在建立派生類對象時,先調用基類的構造函數,再調用派生類的構造函數
D.在銷毀派生類對象時,先調用基類的析構函數,再調用派生類的析構函數

 答案:D

 

2-54以下關於C++語言中繼承的敘述中,錯誤的是( )。
(2分)
A.繼承是父類和子類之間共享數據和方法的機制
B.繼承定義了一種類與類之間的關系
C.繼承關系中的子類將擁有父類的全部屬性和方法
D.繼承僅僅允許單繼承,即不允許一個子類有多個父類

 答案:D

  此題考查的是派生類的構造函數和析構函數。在撤銷派生類對象時,析構函數的執行過程和構造函數嚴格相反,即:對派生類新增普通成員進行清理;調用成員對象析構函數,調用基類析構函數對基類進行清理。

 

2-55派生類繼承基類的方式有
(2分)
A.public
B.private
C.protected
D.以上都對

 答案:D

 

2-56下面關於類的繼承與派生的程序,其輸出結果是

```C++ #include using namespace std; class A { public: A(int i) { x = i; } void dispa() { cout << x << ','; } private: int x; }; class B: public A { public: B(int i) : A(i + 10) { x = i; } void dispb() { dispa(); cout << x << endl; } private: int x; }; int main() { B b(2);
(2分)
A.dispb(); return 0; } ```
B.10,2
C.12,10
D.12,2
E.2,2

 答案:D

#include<bits/stdc++.h>
using namespace std;
class A {
    public:
        A(int i) {
            x = i;
        } void dispa() {
            cout << x << ',';
        } private:
        int x;
};
class B: public A {
    public:
        B(int i) : A(i + 10) {
            x = i;
        } void dispb() {
            dispa();
            cout << x << endl;
        } private:
        int x;
};
int main() {
    B b(2);//A的x為12,B的x為2 
    b.dispb();
    return 0;
}

 

 

2-57若obj是類D的對象,則下列語句中正確的是

class B{
private: void fun1(){ }
protected: void fun2(){ }
public: void fun3(){ }
};
class D : public B {
protected: void fun4(){ }
};

(2分)
A.obj.fun1();
B.obj.fun2();
C.obj.fun4();
D.obj.fun3();

 答案:D

  本題考查公用繼承對基類成員的訪問屬性。在公用繼承中,基類的公用成員和保護成員在派生類中保持原有的訪問屬性,其私有成員仍為基類私有。所以在本題中,在類外引用成員函數時,派生對象只能引用基類的公用成員函數fun1,故本題答案為A。

 

2-58以下說法不正確的是(假設在公有派生情況)?
(2分)
A.可以將基類對象賦值給派生類對象
B.可以將派生類對象的地址賦值給基類指針
C.可以將派生類對象賦值給基類的引用
D.可以將派生類對象賦值給基類對象

 答案:A

 

2-59以下說法正確的是?
(2分)
A.派生類可以和基類有同名成員函數,但是不能有同名成員變量
B.派生類的成員函數中,可以調用基類的同名同參數表的成員函數
C.派生類和基類的同名成員函數必須參數表不同,否則就是重復定義
D.派生類和基類的同名成員變量存放在相同存儲空間

 答案:B

 

2-60下列程序的執行結果為

#include <iostream>
using namespace std;

class A {
public:
    A() {     cout << "1";    }
    ~A() {    cout << "2";    }
};
class B: public A {
public:
    B() {    cout << "3";    }
    ~B() {    cout << "4";    }
};
int main() {
    B b;
    return 0;
}

(2分)
A.1234
B.1324
C.1342
D.3142

 答案:C

 

2-61下面的概念,哪個不是關於對象的多態性的體現。
(2分)
A.方法的重載
B.方法的繼承
C.方法的覆蓋
D.對象的上、下轉型

 答案:B

 

2-62關於面向對象的特征

▁▁▁▁▁ 不是面向對象的特征。
(2分)
A.多態性
B.繼承性
C.封裝性
D.過程調試

 答案:D

 

2-63在C++中用類將數據和對數據操作的代碼連接在一起稱為( )
(2分)
A.軟件重用
B.封裝
C.集合
D.多態

 答案:B

 

2-64在派生類中,重載一個虛函數時,要求函數名、參數的個數、參數的類型、參數的順序和函數的返回值。
(2分)
A.相同
B.不同
C.相容
D.部分相同

 答案:A

 

2-65虛析構函數的作用是。
(2分)
A.虛基類必須定義虛析構函數
B.類對象作用域結束時釋放資源
C.delete動態對象時釋放資源
D.無意義

 答案:C

 

2-66下面函數原型中,( )聲明了fun為純虛函數。
(2分)
A.void fun()=0
B.virtual void fun()=0
C.virtual void fun()
D.virtual void fun(){ }

答案:B

 

2-67若一個類中含有純虛函數,則該類稱為。
(2分)
A.基類
B.純基類
C.抽象類
D.派生類

 答案:C

  純虛函數一般提供派生類進行繼承的參考,是多態性的重要保證,一個具有純虛函數的類稱為抽象類,抽象類可以具有其他類的特點,但它不能定義對象,不能聲明為內聯函數。

 

2-68下面描述中,正確的是( )。
(2分)
A.虛函數是沒有實現的函數
B.純虛函數是返回值等於0的函數
C.抽象類是只有純虛函數的類
D.抽象類指針可以指向不同的派生類

 答案:D

 

 

2-69下面是關於ios 類的敘述,正確的是( )。
(2分)
A.它是istream 類和ostream 類的虛基類
B.它只是istream 類的虛基類
C.它只是ostream 類的虛基類
D.它是iostrearm 類的虛基類

 答案:A

 

2-70當使用ifstream 流類定義一個流對象並打開一個磁盤文件時,文件的隱含打開方式為( )。
(2分)
A.ios::in
B.ios::out
C.ios::in|ios::out
D.ios::binary

 答案:A

當使用ifstream 流類定義一個流對象並打開一個磁盤文件時,文件的隱含打開方式為ios::in。

而對類ostream文件打開的方式默認為ios::out

C++中文件的打開與關閉

 

 

2-71下列函數中,( )是對文件進行寫操作的。
(2分)
A.get
B.read
C.seekg
D.put

 答案:D

C 此函數一般用於二進制模式打開的文件中,功能是定位到流中指定的位置

C++文件操作大全

 

2-72下列打開文件的表達式中,錯誤的是:
(2分)
A.ofstream ofile; ofile.open(“C:\vc\abc.txt”,ios::binary);
B.fstream iofile;iofile.open(“abc.txt”,ios::ate);
C.ifstream ifile (“C:\vc\abc.txt”);
D.cout.open(“C:\vc\abc.txt”,ios::binary);

 答案:D

  本題考核文件的I/O操作。流可以分為3類:輸入流、輸出流以及輸入/輸出流,相應地必須將流說明為ifstream、ofstream以及fstream類的對象。如,說明一個輸入流對象:ifstream ifile;。說明了流對象后,可使用函數open()打開文件。文件的打開即是在流與文件之間建立一個連接。open()的函數原型為:void open(const char *filename,int mode,int port=filebuf::openprot);其中,filename是文件名字,它可包含路徑說明。mode說明文件的打開模式。除了open()成員函數外,ifstream、ofstream以及fstream 三類流的構造函數也可以打開文件,其參數同open()函數。例如:ifstream ifile('c:\\vc\\abc.txt");C選項。打開的文件使用完畢后,必須使用close()函數將其關閉。close()函數也是流類的成員函數,它沒有參數與返回值,其作用是將緩沖區的內容刷新並撤銷流與文件之間的連接。當流對象的生存周期后,相應的析構函數也會將文件關閉。由此可知,A、B和C選項的表達式都是正確的。對於D選項,由於open函數並不是tout對象中的成員函數,所以對open的調用是非法的。

 

2-73對磁盤文件進行操作時,以____模式打開的文件,可實現創建一個可以寫入的、新的空文件;如果該文件已經存在,則先刪除以前的內容,再寫入新數據。
(2分)
A.ios::in
B.ios::app
C.ios::out
D.ios::binary

 答案:C ios::out 以輸出方式打開文件(這是ostream的默認方式)

 

2-74下列關於文件的打開與關閉的描述中,錯誤的是____。
(2分)
A.ifstream類. ostream類和fstream類都提供了成員函數open()用於打開文件
B.對於ifstream類對象其打開文件的默認方式是ios::in,ostream類對象打開文件的默認方式是ios::out
C.對於ofstream類來說,析構函數會自動完成關閉,然后可以在這個流上打開另外一個文件
D.文件的打開方式可以組合使用

 答案:C

雖然ofstream析構函數會自動完成關閉,但如果在同一流對象上打開另外的文件,就需要使用close函數。

 

 

2-75關於動態綁定的下列描述中,( )是錯誤的。
(2分)
A.動態綁定是以虛函數為基礎的
B.動態綁定在運行時確定所調用的函數代碼
C.動態綁定調用函數操作是通過指向對象的指針或對象引用來實現的
D.動態綁定是在編譯時確定操作函數的

 答案:D

  動態聯編一直到程序運行時才能確定調用哪個函數。沒有虛函數不能夠實現動態聯編,調用虛函數操作的是指向對象的指針或者對象的引用。

 

 

2-76關於虛函數的描述中,( )是正確的。
(2分)
A.虛函數是一個static 類型的成員函數
B.虛函數是一個非成員函數
C.基類中說明了虛函數后,派生類中與其對應的函數可不必說明為虛函數
D.派生類的虛函數與基類的虛函數具有不同的參數個數和類型

答案:C

  虛函數是允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問基類和派生類中的同名函數。在基類中用virtual聲明成員函數為虛函數,在派生類中重新定義此函數,要求函數名、函數類型、函數參數個數和類型全部與基類的虛函數相同。

 

 

2-77以下說法中正確的是()
(2分)
A.在虛函數中不能使用this指針
B.在構造函數中調用虛函數不是動態聯編
C.抽象類的成員函數都是純虛函數
D.構造函數和析構函數都不能是虛函數

 答案:B 構造函數和析構函數調用虛函數時都不使用動態聯編,如果在構造函數或析構函數中調用虛函數,則運行的是為構造函數或析構函數自身類型定義的版本。

D  構造函數不能為虛函數,析構函數可以是虛函數

 

2-78虛函數必須是類的____
(2分)
A.成員函數
B.友元函數
C.構造函數
D.析構函數

 答案:A 虛函數只能是類的成員函數,不能是構造函數或析構函數。

 

2-79派生類中虛函數原型的()。
(2分)
A.函數類型可以與基類中虛函數的原型不同
B.參數個數可以與基類中虛函數的原型不同
C.參數類型可以與基類中虛函數的原型不同
D.以上都不對

 答案:D

 

2-80下列描述中,( )是抽象類的特性。
(2分)
A.可以說明虛函數
B.可以進行構造函數重載
C.可以定義友元函數
D.不能定義該類對象

答案:D

①抽象類是指至少有一個純虛函數的類。它往往表示一些抽象的概念,它的成員函數沒有什么意義。
②抽象類是一種特殊的類,它是為了抽象和設計的目的而建立的,它處於繼承層次結構的上層。抽象類的主要作用是將有關的類組織在一個繼承層次結構中,由它來為它們提供一個公共的根,相關的子類是從這個根派生出來的。
③對於抽象類的使用有幾點規定:抽象類只能用作其他類的基類,不能建立抽象類對象;抽象類不能用作參數類型、函數返回類型或顯式轉換的類型;可以說明指向抽象類的指針和引用,此指針可以指向它的派生類,進而實現多態性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM