写完了基础的不同,在看看高级的一些用法吧。 真正的高手都差在深入的研究上,我估计也就算是个装高手的。关于基础的不同可以参见:C++比C多了什么。。。(基础篇)
一、模板
1、函数模板
模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载。这在一定程度上实现了宏(macro)的作用。
#include<iostream> using namespace std; template <class T> T getmax(T a,T b){ return a>b?a:b; } int main(){ int a=3; int b=4; float c =5.5; float d =6.6; cout<<getmax(a,b)<<endl; cout<<getmax(c,d)<<endl; }
运行输出为: 4 6.6
2、类模板
不但函数可以应用类同样也可以。应用了模板,就变成了模板类
#include<iostream> using namespace std; template <class T> class A{ T a; public : A(T t){a=t;} T get_value(); }; template <class T> T A<T>::get_value(){ return a; }; int main(){ A<int> a(3); cout<<a.get_value()<<endl; }
3、模板特殊化#include<iostream> using namespace std; template <class T> class A{ T a; public : A(T t){a=t;} T get_value(); }; template <class T> T A<T>::get_value(){ return a; }; template <> class A<float>{ //特殊化模板为float float a; public : A(float t){a=t;} float get_value(); }; float A<float>::get_value(){ return a+0.00234; }; int main(){ A<int> a(3); A<float> b(4.5); cout<<a.get_value()<<endl; cout<<b.get_value()<<endl; }
运行输出为: 3 4.50234
二、名空间
通过使用名空间(Namespaces)我们可以将一组全局范围有效的类、对象或函数组织到一个名字下面。换种说法,就是它将全局范围分割成许多子域范围,每个子域范围叫做一个名空间(namespaces).
#include<iostream> using namespace std; namespace haha{ string s= "hahaha"; } namespace gaga{ string s= "gaga"; } namespace heihei{ string s = "heihei"; } using namespace haha; int main(){ cout<<s<<endl; cout<<gaga::s<<endl; }
三、出错处理
这个和java差不多了,就不细说了,没什么特别的。
#include<iostream> using namespace std; int main(){ try{ char a[10]; for(int i=0;i<20;i++){ if(i>9) throw i; a[i] = i; } }catch(int i){ cout<<"Exception : "<<i<<endl; } }
四、类型转换
ANSI-C++ 标准定义了4种新的类型转换操作符: reinterpret_cast, static_cast, dynamic_cast 和 const_cast。
reinterpret_cast 可以将一个指针转换为任意其它类型的指针。它也可以用来将一个指针转换为一个整型,或反之亦然。
static_cast 可以执行所有能够隐含执行的类型转换,以及它们的反向操作(即使这种方向操作是不允许隐含执行的)。
dynamic_cast 完全被用来进行指针的操作。它可以用来进行任何可以隐含进行的转换操作以及它们被用于多态类情况下的方向操作。然而与static_cast不同的是, dynamic_cast 会检查后一种情况的操作是否合法,也就是说它会检查类型转换操作是否会返回一个被要求类型的有效的完整的对象。
const_cast 这种类型转换对常量const 进行设置或取消操作:
class C {}; const C * a = new C; C * b = const_cast<C*> (a);
其他3种cast 操作符都不可以修改一个对象的常量属性。
五、预处理指令
#define name value 宏定义,用value完全替换name
#undef name value 取消刚才的宏定义。通常用来重定义宏
#ifdef, #ifndef, #if, #endif, #else and #elif(elif=else if) 定义条件的逻辑应用
#if MAX_WIDTH>200 #undef MAX_WIDTH #define MAX_WIDTH 200 #elif MAX_WIDTH<50 #undef MAX_WIDTH #define MAX_WIDTH 50 #else #undef MAX_WIDTH #define MAX_WIDTH 100 #endif char str[MAX_WIDTH];