C++比C多了什么。。。(高级篇)

来源:互联网 发布:javascript 第六版pdf 编辑:程序博客网 时间:2024/05/01 04:53

    写完了基础的不同,在看看高级的一些用法吧。  真正的高手都差在深入的研究上,我估计也就算是个装高手的大笑。关于基础的不同可以参见: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];

 

 


 

 

      

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁宝宝足外翻怎么办 2岁宝宝小腿弯怎么办啊 一岁宝宝小腿弯怎么办 一岁小儿o型腿怎么办 两岁宝宝o型腿怎么办 狗狗前腿外八字怎么办 20岁走路内八字怎么办 9岁儿童脚内八字怎么办 5岁宝宝脚内八字怎么办 一岁宝宝内八字怎么办 两人八字合不合怎么办 考到不好的大学怎么办 考的大学不理想怎么办 只考上二本大学怎么办 w7电脑中病毒了怎么办 电脑中病毒了该怎么办 泰迪呼吸急促怎么办啊 狗狗呼吸急促是怎么办 狗狗着凉了呕吐怎么办 狗鼻子流黄鼻涕怎么办 刚出生婴儿睡觉不踏实怎么办 有人溺水后你该怎么办 借钱不还怎么办没欠条 私人欠货款不还怎么办 公司欠货款不还怎么办 两个人离婚一方不同意怎么办 比亚迪l3油耗高怎么办 u盘密码忘记了怎么办 主板没有m.2接口怎么办 点痣留下了疤怎么办 危险三角区长痘痘怎么办 挤了危险三角区怎么办 三角区长痘挤了怎么办 三角区发红长痘怎么办 激光祛斑碰水了怎么办 激光打痣留下坑怎么办 点痣之后留下坑怎么办 去痣留下的红印怎么办 激光点痦子留疤怎么办 激光点痣的疤痕怎么办 做完眉毛碰水了怎么办