c++笔记
2016年04月23日

include实际是把文件内容附加到这个引用的位置

    //文件src1
    cout<<123;
    
    voud run()
    {
    //cout<<123;
    #include "src1"
    }

前置声明

前置声明只能在不使用类的大小和成员的情况下才可以使用.
如果需要使用A类成员,需要先声明A类,然后在实现B类方法.

    class A;
    class B
    {
        private:
            A* a;
        //A a; 错误
        void exec(A& a);
    }
    
    class A
    {
        public:
            void exec();
    };
    
    B::exec(A& a)
    {
        a->exec();
    }

重载和函数操作符

假设一个类同时存在+号重载和函数操作符,
在同时定义类型转换函数和+操作符重载的情况下,int i = class1 +0;调用的操作符重载;

    class class1
    {
        public:
            int operator+(int i);
            operator int();
    };
    
    
    class dog
    {
    public:
        dog(int i=0){}
        dog operator+(const dog& d);
    };
    
    //错误,没有整型的操作符重载
    //dog d = dog(5) + 2; 

空指针

c++对于已经释放的指针会进行判断,虽然不会崩溃,但是程序已经中断执行了.但是如果在指针被设置成0(NULL)以后,就没有问题了.

异常处理

捕获所有异常的省略号就是三个点(3个字符),不是省略号

    try{
    }catch(...){
    }

如果选择捕获异常的基类类型,需要用的时候需要利用指针转换成派生类(不安全)

    class exception1{};
    class exception2: public exception1{};
    try{
    }catch(exception1 e1)
    {
        //错误,不能见基类转成派生类,但指针可以,但是不安全
        //exception2 e2 = (exception2)e1;
        exception2* e2 = (exception2*)(&e1);
    }

const_cast

const_cast的作用是去掉变量的只读表示,从而忽略编译器检测.
而如果指针变量本身对应的变量就是只读的,指针变量虽然去掉只读后可以赋值,但是值不会改变

    const int i = 2;
    const int* j = &i;
    int* k = const_cast<int*>(j);
    *k = 6;

k虽然变成了6,但是i依然是2

遍历复合类型

遍历复合容器map可以用pair<type1,type2>模板;

    map<int,string> m;
    m[0] = string("abc");
    for_each(m.begin(),m.end(),[](pair<int,string> p)
    {
        cout << p.first << p.second << endl;
    });

wchar_t

wchar_t是宽字符类型至少2字节,char类型1字节
ansic和unicode都是编码类型,ansic用一个字节保存英文,2个字节保存中文.最多存储256个字符.unicode所有字符都是2字节

    locale loc( "chs" );//定义“区域设置”为中文方式
    wcout.imbue( loc );//载入中文字符输入方式
    wchar_t arr[] = L"今天天气不错abc";
    //wcout << arr << endl;
    for_each(arr,arr+sizeof(arr),[](wchar_t c){wcout << c << endl;});

编码和类型是两回事,char也可以输出中文的原因是在于ansic用两个字符保存中文.所以for_each char类型的中文会无法显示,而wchar_t则可以显示.
wchar_t 类型的字符串需要前边加L(大写字母),可以利用TEXT()方法转换char类型的字符串为wchar_t