範本(Template)
提供被參數化的型態(Parameterized Types)功能
將數據跟操作分開
名稱空間 (Namespace)
則提供一個名稱管理容器,減低名稱衝突的機會發生
引用: http://caterpillar.onlyfun.net/Gossip/CppGossip/CppGossip.html
2009年7月22日 星期三
函數指標 (Function pointer) v.s. 指標函數(Pointer to function) (c++)
函數指標 (Function pointer)
例如: int (*p) (int, int)
指向函數地址的指標
指標函數(Pointer to function)
例如: float * q = function(num1, num2)
會return 指標的函數
例如: 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
陣列內的元素都為指標
例如: 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;
本身不能被修改,但指向的內容可以修改
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
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);
定義了函數指標的類型
細分為三種應用
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, 解構化實體
並不負責初始化與解構化
而當使用new/delete 時
編譯器在編譯到new 後
會自動呼叫 Constructor, 初始化類別
編譯到delete 時
會呼叫destructor, 解構化實體
this 指標 (c++)
每一個類別的函式成員(非靜態)都會隱含一個this指標
指向對象物件
當在函式中使用資料成員時
都會隱含的使用this指標指向對象地址
例如:
int data;
MyClass(int data){
this->data = data;
}
指向對象物件
當在函式中使用資料成員時
都會隱含的使用this指標指向對象地址
例如:
int data;
MyClass(int data){
this->data = data;
}
物件導向
物件導向包含以下三個元素:
1. 封裝 (Encapsulation)
將資料屬性與操作方法放在一起
使程式碼易於理解
2. 繼承 (Inheritance)
子類別可以繼承父類別的屬性與方法
重複使用程式碼
3. 多型 (Polymorphism)
可以透過Overriding 和 Overloading 將使用同一方法卻產生不同行為
方便擴充與維護程式
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;
}
不同於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;
}
虛擬函數 (virtual functions)
虛擬函數主要是用來實現多型 (Polymorphism)
透過Overriding 的手法
可以覆寫掉base class 的方法
不用宣告類別為何
即可使用該類別方法
透過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; }
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;
}
訂閱:
文章 (Atom)