顯示具有 Interview Question 標籤的文章。 顯示所有文章
顯示具有 Interview Question 標籤的文章。 顯示所有文章

2009年7月22日 星期三

範本(Template)& 名稱空間(Namespace)(C++)

 範本(Template)


提供被參數化的型態(Parameterized Types)功能


將數據跟操作分開


名稱空間 (Namespace)


則提供一個名稱管理容器,減低名稱衝突的機會發生


引用: http://caterpillar.onlyfun.net/Gossip/CppGossip/CppGossip.html

函數指標 (Function pointer) v.s. 指標函數(Pointer to function) (c++)

函數指標 (Function pointer)


例如: int (*p) (int, int)


指向函數地址的指標


指標函數(Pointer to function)


例如: float * q = function(num1, num2)


會return 指標的函數

指標陣列(Pointer Array) v.s. 陣列指標(Array Pointer) (c++)

指標陣列 (Pointer Array):

陣列內的元素都為指標

例如: int *a[10];


陣列指標(Array Pointer):

指向陣列的指標

例如: int *a = new int [100];

記得要使用 delete[] 否則會造成 memory leak

常數指標(pointer to constant object) v.s. 指標常數(constant pointer to object) (c++)

Pointer to constant object (const 放在 * 的左邊):


char const * p2;
const char *p3;


被指向的內容不得被修改


但可以做以下的操作


const char* node1 ="abc";
node1 = "xyz"; // node1 可以改指向xyz


Constant pointer to object (const 放在* 的右邊)


char*const p1;
本身不能被修改,但指向的內容可以修改

Class v.s. Struct (c++)

Class 和 Struct 的差別主要有兩個:

1. Struct 定義複雜數據類型, 不能用於OO上

2. class 默認的權限是private
Struct 默認為public

Typedef (c++)

主要功用是為型態取別名

細分為三種應用

1. 簡單型態的別名

typedef unsigned long DWORD;

2. 結構型態的別名

例:
typedef struct card{
int point, char suit;
}name1, *name2;

即可用 name1 obj1, name2 obj2 來建構結構

3. 函式型態的別名

typedef int (*fun)(int x, int y);

定義了函數指標的類型

malloc/free v.s. new/delete

在c中,malloc 只負責配置記憶體, free 只負責釋放記憶體

並不負責初始化與解構化

而當使用new/delete 時

編譯器在編譯到new 後

會自動呼叫 Constructor, 初始化類別

編譯到delete 時

會呼叫destructor, 解構化實體

this 指標 (c++)

每一個類別的函式成員(非靜態)都會隱含一個this指標

指向對象物件

當在函式中使用資料成員時

都會隱含的使用this指標指向對象地址

例如:
int data;
MyClass(int data){
this->data = data;
}

引用跟指標的差別

不同指標可以指向NULL

引用必須初始化

例如: int&rn = a; (a 引用 rn)

而且一但初始化後就不能改變引用的對象

因此比指標來的安全

物件導向

物件導向包含以下三個元素:

1. 封裝 (Encapsulation)

將資料屬性與操作方法放在一起
使程式碼易於理解

2. 繼承 (Inheritance)

子類別可以繼承父類別的屬性與方法
重複使用程式碼

3. 多型 (Polymorphism)

可以透過Overriding 和 Overloading 將使用同一方法卻產生不同行為
方便擴充與維護程式

Inline v.s. Macro

Inline 是在c++ 中加進來以改進c macro 的缺點

不同於macro, Inline 有透過 compiler 做編譯

因而擁有Compiler 所提供的型別確認(Type checcking)的好處

例如:

#define ABS(a) ((a>0)?(a):(-a))

inline int ABS(int a){
if(a>0)
return a;
else
return -a;
}

抽象類別 (Abstract classes)

當所使用的物件都繼承同一基礎類別時

但該類別方法卻不需被實現時

可以建立一個純虛擬函數

例: virtual int f() = 0

做為抽象類別

虛擬函數 (virtual functions)

虛擬函數主要是用來實現多型 (Polymorphism)

透過Overriding 的手法

可以覆寫掉base class 的方法

不用宣告類別為何

即可使用該類別方法

自訂一個strcat (c++)


#include <iostream>
using namespace std;

char *strcat2(char *dest, const char*src);
int main(void){

        char* dest = (char *)malloc(256);
        *dest='\0';
        cout<<strcat2(dest,"concat string")<<endl;

        return 0;
}

char *strcat2(char *dest, const char*src){
        char *ret;
        ret = dest;
        while(*dest++);
        dest--;
        while(*dest++= *src++);

        return ret;
}

Extern (c++)

Extern可以聲明變數會在其它的位置被定義,這個位置可能是在同一份文件之中,或是在其它文件之中.

2009年7月21日 星期二

Palindrome (c++)



#include <iostream>
#include <string>
using namespace std;

int main(void){
string s = "abcdef";
string::iterator pos;
reverse(s.begin(), s.end());

string tmp ="";
for(int i=0; i< s.length(); i++){
tmp += s[s.length()-i-1];
}

for(pos = s.begin(); pos != s.end(); ++pos)
cout<<*pos;
cout<<endl;

cout<<s<<endl;
cout<<tmp<<endl;
return 0;
}

String & int conversion (c++)



#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(void){

string s= "12345678";

/*string to int:: c_str() version*/
cout<<atoi(s.c_str())+123<<endl;

/*string to int :: stringstream version*/
int tmp;
stringstream ss1(s);
ss1 >> tmp;
cout<< tmp+4<<endl;

int ints = 123;
/*int to string :: sprintf version*/
char str_2[10];
sprintf(str_2,"%d",ints);
cout<<str_2[2]<<endl;
/*int to string :: stringstream version*/
stringstream ss;
ss <<ints;
string str = ss.str();
cout<<str<<endl;
cout<<str[2]<<endl;

return 0;
}

Character Array Shift (c++)



#include <iostream>
using namespace std;

int main(void){
char input[] ="12345678";
int length =(sizeof(input)-1);
int shift;
cin>>shift;
shift = shift % length;
char *tmp = new char[length];
for(int i=0; i< length; i++)
tmp[i]= input[(i+shift)%length];
cout<< tmp <<endl;
return 0;
}

MAX, MIN ,AVG (c++)



#include <iostream>
using namespace std;

int main(void){
int loop;
cin>>loop;
int *ary = new int[loop];

for(int i=0; i<loop; i++){
int tmp;
cin>>tmp;
ary[i] = tmp;
}

int min=ary[0];
int max =ary[0];
float sum =0;
for(int j=1; j< loop ; j++){
if(ary[j]<min)
min = ary[j];
if(ary[j]>max)
max = ary[j];
sum += ary[j];
}
cout<<"Min = "<<min<<endl;
cout<<"Max= "<<max<<endl;
printf("Avg= %.2f\n",(sum/loop));

}

Leap Year (c++)



#include <iostream>
using namespace std;

int main(void){
int year;
cin>> year;
if(year%4==0 && year%100!=0||year%400==0)
cout<<year<<" is Leap Year"<<endl;
else
cout<<year<<" is not Leap Year"<<endl;

return 0;
}