一纸代码手记

前言

自从学习到工作,使用c++已近7个年头,其中所遇疑难杂症数不胜数。以往遇难题,即查之,又忘之,犹如过眼云烟。现痛定思痛,将所遇之困惑、易成bug之代码一一记。一为留个念想,证明世间吾曾来过呼,二则未来遇类似之问题,以便查阅。

c++不具名命名空间

  • 命名空间是用来防止对象重复定义的。
  • 不具名命名空间也是防止对象重复定义的,只是没有名字而已
  • 不能在头文件中书写不具名命名空间
  • 在cpp 中写不具名命名空间,本文件中是可以直接使用,别的文件无法使用。
 namespace 
 {
    
    
     int x;
     int y;
     int myfun();
 }

utf8、utf8 BOM、utf8带签名

  • UTF-8 BOM与UTF-8带签名指的是同一回事,二者指的是UTF-8的同一格式
  • UTF-8 BOM中的BOM,全称为Byte order mark。
  • 带BOM(签名)的UTF-8文本文件与不带BOM的UTF-8文本文件的区别在于:前者在文件的开头有3个字节 EF BB BF
  • 在windows平台上,默认的utf-8格式文本都是带BOM的,并且文本编辑器都能识别BOM;而在其他的平台,比如Linux下的文本处理器很可能是不识别BOM的,会导致文件的第一行读不出来。而一般上认为不带BOM的utf-8格式是标准格式。
  • 不带bom的文本才是标准的utf8

DML是个啥呢?

  • 他是数据操作语言,记录表的操作(增、删、改)

回调函数的区别

  • callback 面向过程的, C语言
  • sink 面向c++接口的,需要实现一个类。
  • delegate 设置类的成员函数。。

typedef 和typedef typename 的区别

typedef

  1. typedef是用于定义类型的
    typedef list<int> ListNum;
    listNum num{
          
          1,2,3,4};
    
  2. 定义指向成员的指针
    class Foo
    {
          
          
     public:
        void f()
        {
          
          
    
        }
     private:
         int a;
    };
     typedef void(A::*fp)(); // fp为函数指针的别名
    
    

typename

  1. typename T;表示T的定义还没有给出,这个语句通常出现在模版的定义内
    typedef typename T::a TA; // 这里不指定变量 T是一个未声明的类型,为泛型,只有等确定了T的类型 就可以替换 Foo::a
    TA ta; // 声明ta,类型为T::a
    typename T::a a; // 声明a 的类型为T::a
    // typedef typename 这句话的意思就是: typedef重新定义别名,typename确
    
    
  2. template ; 表示T是一个类型,
    template<typename T> // 等价于template<Cclass T>
    void f(T t); 
    ``
    
  3. typename和class的区别
    • class 表明后面的符号是一个类型
    • class 定义一个类
    • 模板引入c++后,最初定义模板的方法为: template……在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,
  4. 总结
    • typename 后面标识一种类型。这种类型暂时还不知道,只有实例化模板之后才能确定该类型
    • typedef 重定义别名, typedef typename 就是 重定义一种还没有确定的类型的别名。typedef typename T U, 就是把T这种类型重定义别名为U。
    • typedef typename 作用
    template < class T >
    void Foo( T arr)
    {
          
          
        // 告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量
        // 加入没有typename 编译器不知道T::length 是类型还是类的成员
        typedef typename T::length LengthType ; 
        LengthType length = arr.GetLength ;
    }
    

C++类对象为nullptr是可以调用成员方法的,只要不是访问成员变量,是不会报错的。如果访问成员变量即crash

#include <iostream>

using namespace std;
class person
{
public:
    person()
    {}
    person(string a = "", int b = 12)
        :name(a), age(b)
    {}
    void test()
    {
        cout << "这是test" << endl;
    }
    void change()
    {
        cout << "这是change" << endl;
        cout << name.c_str() << endl;
    }
    ~person()
    {}
private:
        string name;
    int age;
};
//
void test()
{
    person A("sss",13);
    person B("sddd", 15);
    person* p = nullptr;
        A.test();
    A.change();
    p->test();
    p->change();
}


int main(int argc, const char * argv[]) {
    test();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33944628/article/details/124435145