1. #include < filename.h >和#include “filename.h” 有什麼區別?
答:對於#include < filename.h >,編譯器從標準庫路徑開始搜索filename.h 對於#include “filename.h”,編譯器從用戶的工作路徑開始搜索filename.h
2. 在C++ 程序中調用被C 編譯器編譯後的函數,爲什麼要加extern “C”?
答:C++語言支持函數重載,C 語言不支持函數重載。函數被C++編譯後在庫中的名字與C 語言的不同。假設某個函數的原型爲: void foo(int x, int y);
該函數被C 編譯器編譯後在庫中的名字爲_foo , 而C++ 編譯器則會產生像_foo_int_int 之類的名字。
C++提供了C 連接交換指定符號extern“C”來解決名字匹配問題。
3. 一個類有基類、內部有一個其他類的成員對象,構造函數的執行順序是怎樣的?
答:先執行基類的(如果基類當中有虛基類,要先執行虛基類的,其他基類則按照聲明派生類時的順序依次執行),再執行成員對象的,最後執行自己的。
4. New delete 與malloc free 的區別
答:用malloc 函數不能初始化對象,new 會調用對象的構造函數。Delete 會調用對象的destructor,而free 不會調用對象的destructor.
5. Struct 和class 的區別
答:struct 中成員變量和成員函數默認訪問權限是public,class 是private
6.請問下面程序有什麼錯誤?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
答:把循環語句內外換一下
7. 請寫出下列代碼的輸出內容
#include <.stdio.h>
int main() {
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:%d,%d,%d",b,c,d);
return 0;
}
答:10,12,120
8. 寫出BOOL,int,float,指針類型的變量a 與零的比較語句。
答:
BOOL : if ( !a )
int : if ( a == 0)
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL)
9.已知strcpy 函數的原型是:
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。不調用C++/C 的字符串庫函數,請編寫函數 strcpy
答:
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL
if ( strDest == strSrc)
return strDest
char *tempptr = strDest
while( (*strDest++ = *strSr) != ‘\0’) ;
return tempptr
}
10.寫一個算法找出一個整數數組中,第二大的數。
答案:
const int MINNUMBER = -32767
int find_sec_max( int data[] , int count) //類似於1 4 4 4這樣的序列將認爲1是第二大數
{
int maxnumber = data[0]
int sec_max = MINNUMBER for ( int i = 1 i < count i++)
{
if ( data[i] > maxnumber )
{
sec_max = maxnumber
maxnumber = data[i]
}
else
{
if ( data[i] > sec_max )
sec_max = [i]
}
}
return sec_max
}
11.已知鏈表的頭結點head, 寫一個函數把這個鏈表逆序。
答案:
Node * ReverseList(Node *head) //鏈表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head
Node *p2 = p1->next
Node *p3 = p2->next
p1->next = NULL
while ( p3 != NULL )
{
p2->next = p1
p1 = p2
p2 = p3
p3 = p3->next //冒泡
}
p2->next = p1
head = p2
return head
}
12. 已知String類定義如下:
class String
{
public:
String(const char *str = NULL); // 通用構造函數
String(const String &another); // 拷貝構造函數
~ String(); // 析構函數
String & operater =(const String &rhs); // 賦值函數
private:
char *m_data; // 用於保存字符串
};
嘗試寫出類的成員函數實現。
答案:
String::String(const char *str)
{
if ( str == NULL ) //strlen在參數爲NULL時會拋異常纔會有這步判斷
{
m_data = new char[1] ;
m_data[0] = '/0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}
}
String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data; //刪除原來的數據,新開一塊內存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}
String::~String()
{
delete []m_data ;
}