當前位置:編程學習大全網 - 編程語言 - 幾道c++簡單問題,謝謝。

幾道c++簡單問題,謝謝。

壹、二、什麽叫棧,什麽叫堆?

操作系統內存分配的兩個概念,都是指壹段內存空間

當程序動態運行的時候,比如說進入壹個函數,而妳在函數中定義了壹些變量,在這個函數的開頭

就會從"棧"分配壹些空間給這些變量,當這個函數退出以後,這些空間就釋放了.

"堆"是為了彌補'棧'分配方式的不足而提出的另外壹種分配方式.

'棧'分配的不足是: 1某壹個函數占用空間的大小必須在編譯的時候就知道,否則不能用棧式分配,

2'棧'分配的空間在函數退出時就釋放了,如果退出函數以後還要使用的話,就不能用棧式分配

棧式分配的'已使用空間'和'未使用空間是連續的,而堆式則是不連續的(不壹定)

對應到C/C++中,int a這種變量定義,用的是棧式分配,而new 或是malloc,則是堆式分配

三、 什麽叫接口

接口(interface)用來定義壹種程序的協定。實現接口的類或者結構要與接口的定義嚴格壹致。有了這個協定,就可以拋開編程語言的限制(理論上)。接口可以從多個基接口繼承,而類或結構可以實現多個接口。接口可以包含方法、屬性、事件和索引器。接口本身不提供它所定義的成員的實現。接口只指定實現該接口的類或接口必須提供的成員。

接口好比壹種模版,這種模版定義了對象必須實現的方法,其目的就是讓這些方法可以作為接口實例被引用。接口不能被實例化。類可以實現多個接口並且通過這些實現的接口被索引。接口變量只能索引實現該接口的類的實例。例子:

interface IMyExample {

string this[int index] { get ; set ; }

event EventHandler Even ;

void Find(int value) ;

string Point { get ; set ; }

}

public delegate void EventHandler(object sender, Event e) ;

上面例子中的接口包含壹個索引this、壹個事件Even、壹個方法Find和壹個屬性Point。

接口可以支持多重繼承。就像在下例中,接口"IComboBox"同時從"ITextBox"和"IListBox"繼承。

interface IControl {

void Paint( ) ;

}

interface ITextBox: IControl {

void SetText(string text) ;

}

interface IListBox: IControl {

void SetItems(string[] items) ;

}

interface IComboBox: ITextBox, IListBox { }

類和結構可以多重實例化接口。就像在下例中,類"EditBox"繼承了類"Control",同時從"IDataBound"和"IControl"繼承。

interface IDataBound {

void Bind(Binder b) ;

}

public class EditBox: Control, IControl, IDataBound {

public void Paint( ) ;

public void Bind(Binder b) {...}

}

在上面的代碼中,"Paint"方法從"IControl"接口而來;"Bind"方法從"IDataBound"接口而來,都以"public"的身份在"EditBox"類中實現。

說明:

1、C#中的接口是獨立於類來定義的。這與 C++模型是對立的,在 C++中接口實際上就是抽象基類。

2、接口和類都可以繼承多個接口。

3、而類可以繼承壹個基類,接口根本不能繼承類。這種模型避免了 C++的多繼承問題,C++中不同基類中的實現可能出現沖突。因此也不再需要諸如虛擬繼承和顯式作用域這類復雜機制。C#的簡化接口模型有助於加快應用程序的開發。

4、壹個接口定義壹個只有抽象成員的引用類型。C#中壹個接口實際所做的,僅僅只存在著方法標誌,但根本就沒有執行代碼。這就暗示了不能實例化壹個接口,只能實例化壹個派生自該接口的對象。

5、接口可以定義方法、屬性和索引。所以,對比壹個類,接口的特殊性是:當定義壹個類時,可以派生自多重接口,而妳只能可以從僅有的壹個類派生。

四、什麽叫宏

在用壹種不熟悉的宏語言進行宏編程時,可以這樣做,首先記錄下用戶想要宏完成什麽,然後打開宏文件並嘗試理解命令結構如何工作。也可以修改命令以調整宏。壹些宏語言,比如Great Plains賬務(?accounting)軟件的 Dexterity 運行時引擎,不能從其它數據源(如由逗號分隔的文本文件)導入數據。這壹限制可以通過用更強大的編程語言,如 VBA 來創建壹個計算機程序在此弱編程語言裏生成壹個特別的宏來解決。例如,可以對 Microsoft Excel 宏編程從擴展樣式表或文本文件中讀取數據並創建 Great Plains .mac 文件,這壹文件被用於將特定的數據導入 Great Plains. 需要針對每壹個新的數據集合聲稱新的 .mac 文件。

五、什麽叫構造函數成員初始化表

構造函數初始化列表以壹個冒號開始,接著是以逗號分隔的數據成員列表,每個數據成員後面跟壹個放在括號中的初始化式。例如: [code] class CExample { public: int a; float b; //構造函數初始化列表 CExample(): a(0),b(8.8) {} //構造函數內部賦值 CExample() { a=0; b=8.8; } }; [/code] 上面的例子中兩個構造函數的結果是壹樣的。上面的構造函數(使用初始化列表的構造函數)顯式的初始化類的成員;而沒使用初始化列表的構造函數是對類的成員賦值,並沒有進行顯式的初始化。初始化和賦值對內置類型的成員沒有什麽大的區別,像上面的任壹個構造函數都可以。對非內置類型成員變量,為了避免兩次構造,推薦使用類構造函數初始化列表。但有的時候必須用帶有初始化列表的構造函數: 1.成員類型是沒有默認構造函數的類。若沒有提供顯示初始化式,則編譯器隱式使用成員類型的默認構造函數,若類沒有默認構造函數,則編譯器嘗試使用默認構造函數將會失敗。 2.const成員或引用類型的成員。因為const對象或引用類型只能初始化,不能對他們賦值。 3.在繼承裏面,只有初始化列表可以構造父類的private成員。 初始化數據成員與對數據成員賦值的含義是什麽?有什麽區別?首先把數據成員按類型分類並分情況說明: 1.內置數據類型,復合類型(指針,引用) 在成員初始化列表和構造函數體內進行,在性能和結果上都是壹樣的 2.用戶定義類型(類類型) 結果上相同,但是性能上存在很大的差別。因為類類型的數據成員對象在進入函數體前已經構造完成,也就是說在成員初始化列表處進行構造對象的工作,調用構造函數,在進入函數體之後,進行的是對已經構造好的類對象的賦值,又調用個拷貝賦值操作符才能完成(如果並未提供,則使用編譯器提供的默認按成員賦值行為) Note: 初始化列表的成員初始化順序: C++初始化類成員時,是按照聲明的順序初始化的,而不是按照出現在初始化列表中的順序。 [code] Example: class CMyClass { CMyClass(int x, int y); int m_x; int m_y; }; CMyClass::CMyClass(int x, int y) : m_y(y), m_x(m_y) { } [/code] 妳可能以為上面的代碼將會首先做m_y=I,然後做m_x=m_y,最後它們有相同的值。但是編譯器先初始化m_x,然後是m_y,,因為它們是按這樣的順序聲明的。結果是m_x將有壹個不可預測的值。有兩種方法避免它,壹個是總是按照妳希望它們被初始化的順序聲明成員,第二個是,如果妳決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助於消除混淆。

六、什麽叫函數參數表

所謂的函數參數表就是函數所用到的所有參數集合的表,比如說VB 中API 函數中各個函數的參數表/vbapi/index.asp

七、什麽叫參數列表

妳想要的應該就是oracle_home\admin\sid\pfile下的init.ora吧!

八、什麽叫const

關於C++中的const關鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,現將本人的壹些體會總結如下,期望對大家有所幫助:

壹 const基礎

如果const關鍵字不涉及到指針,我們很好理解,下面是涉及到指針的情況:

int b = 500;

const int* a = &b; [1]

int const *a = &b; [2]

int* const a = &b; [3]

const int* const a = &b; [4]

如果妳能區分出上述四種情況,那麽,恭喜妳,妳已經邁出了可喜的壹步。不知道,也沒關系,我們可以參考《Effective c++》Item21上的做法,如果const位於星號的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;如果const位於星號的右側,const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針所指向的內容為常量(const放在變量聲明符的位置無關),這種情況下不允許對內容進行更改操作,如不能*a = 3 ;[3]為指針本身是常量,而指針所指向的內容不是常量,這種情況下不能對指針本身進行更改操作,如a++是錯誤的;[4]為指針本身和指向的內容均為常量。

另外const 的壹些強大的功能在於它在函數聲明中的應用。在壹個函數聲明中,const 可以修飾函數的返回值,或某個參數;對於成員函數,還可以修飾是整個函數。有如下幾種情況,以下會逐漸的說明用法:

A& operator=(const A& a);

void fun0(const A* a );

void fun1( ) const; // fun1( ) 為類成員函數

const A fun2( );

二 const的初始化

先看壹下const變量初始化的情況

1) 非指針const常量初始化的情況:

A b;

const A a = b;

2) 指針(引用)const常量初始化的情況:

A* d = new A();

const A* c = d;

或者:const A* c = new A();

引用:

A f;

const A& e = f; // 這樣作e只能訪問聲明為const的函數,而不能訪問壹般的成員函數;

[思考1]: 以下的這種賦值方法正確嗎?

const A* c=new A();

A* e = c;

[思考2]: 以下的這種賦值方法正確嗎?

A* const c = new A();

A* b = c;

三 作為參數和返回值的const修飾符

其實,不論是參數還是返回值,道理都是壹樣的,參數傳入時候和函數返回的時候,初始化const變量

1 修飾參數的const,如 void fun0(const A* a ); void fun1(const A& a);

調用函數的時候,用相應的變量初始化const常量,則在函數體中,按照const所修飾的部分進行常量化,如形參為const A* a,則不能對傳遞進來的指針的內容進行改變,保護了原指針所指向的內容;如形參為const A& a,則不能對傳遞進來的引用對象進行改變,保護了原對象的屬性。

[註意]:參數const通常用於參數為指針或引用的情況;

2 修飾返回值的const,如const A fun2( ); const A* fun3( );

這樣聲明了返回值後,const按照"修飾原則"進行修飾,起到相應的保護作用。

const Rational operator*(const Rational& lhs, const Rational& rhs)

{

return Rational(lhs.numerator() * rhs.numerator(),

lhs.denominator() * rhs.denominator());

}

返回值用const修飾可以防止允許這樣的操作發生:

Rational a,b;

Radional c;

(a*b) = c;

壹般用const修飾返回值為對象本身(非引用和指針)的情況多用於二目操作符重載函數並產生新對象的時候。

[總結] 壹般情況下,函數的返回值為某個對象時,如果將其聲明為const時,多用於操作符的重載。通常,不建議用const修飾函數的返回值類型為某個對象或對某個對象引用的情況。

原因如下:如果返回值為某個對象為const(const A test = A 實例)或某個對象的引用為const(const A& test = A實例) ,則返回值具有const屬性,則返回實例只能訪問類A中的公有(保護)數據成員和const成員函數,並且不允許對其進行賦值操作,這在壹般情況下很少用到。

[思考3]: 這樣定義賦值操作符重載函數可以嗎?

const A& operator=(const A& a);

四 類成員函數中const的使用

壹般放在函數體後,形如:void fun() const;

如果壹個成員函數的不會修改數據成員,那麽最好將其聲明為const,因為const成員函數中不允許對數據成員進行修改,如果修改,編譯器將報錯,這大大提高了程序的健壯性。

五 使用const的壹些建議

1 要大膽的使用const,這將給妳帶來無盡的益處,但前提是妳必須搞清楚原委;

2 要避免最壹般的賦值操作錯誤,如將const變量賦值,具體可見思考題;

3 在參數中使用const應該使用引用或指針,而不是壹般的對象實例,原因同上;

4 const在成員函數中的三種用法(參數、返回值、函數)要很好的使用;

5 不要輕易的將函數的返回值類型定為const;

6 除了重載操作符外壹般不要將返回值類型定為對某個對象的const引用;

本人水平有限,歡迎批評指正,可以聯系 kang_jd@163.com

[思考題答案]

1 這種方法不正確,因為聲明指針的目的是為了對其指向的內容進行改變,而聲明的指針e指向的是壹個常量,所以不正確;

2 這種方法正確,因為聲明指針所指向的內容可變;

3 這種做法不正確;

在const A::operator=(const A& a)中,參數列表中的const的用法正確,而當這樣連續賦值的時侯,問題就出現了:

A a,b,c:

(a=b)=c;

因為a.operator=(b)的返回值是對a的const引用,不能再將c賦值給const常量。

九、區分重載函數的標誌就是參數列表不壹樣嗎

是的。所謂函數重載是指同壹個函數名可以對應著多個函數的實現。例如,可以給函數名add()定義多個函數實現,該函數的功能是求和,即求兩個操作數的和。其中,壹個函數實現是求兩個int型數之和,另壹個實現是求兩個浮點型數之和,再壹個實現是求兩個復數的和。每種實現對應著壹個函數體,這些函數的名字相同,但是函數的參數的類型不同。這就是函數重載的概念。函數重載在類和對象的應用尤其重要。

十、字符數組與字符串數組有什麽區別

具體的例子解釋可以到這裏看看/mythkina/blog/item/60a5b40983b6fcc83ac7634a.html

十壹、exit函數

在main函數中我們通常使用return (0);這樣的方式返回壹個值。 但這是限定在非void情況下的也就是void main()這樣的形式。 exit()通常是用在子程序中用來終結程序用的,使用後程序自動結束跳會操作系統。 但在如果把exit用在main內的時候無論main是否定義成void返回的值都是有效的,並且exit不需要考慮 #include <iostream> #include <string> using namespace std; int main() { exit (1);//等價於return (1);}

  • 上一篇:西南石油大學專科專業有哪些
  • 下一篇:Android調用照相機和百度地圖開發,百度地圖顯示界面覆蓋了相機界面,求大神解答?
  • copyright 2024編程學習大全網