C++ 零散记录

使用if 对 bool ,int ,指针判断要做出区别, if(fala), if(fala == 0), if(fla == NULL)

float 判断  const d = 0.00001   (if (x > -d)&& x < d).

const 比宏定义好在,const 可以被调试,类中枚举类型不会占用对象存储空间。

return string(1+2)效率高于 ; string (1+2) return string. 因为第一个产生临时变量都是在return的函数外时, 而且也不需析构string。 函数return ,copy 数据到外部存储是在函数结束之前。

在函数内定义char *p='xxx';  return p, 此时编译不会报错,p可以使用,但是不太好。 注意不要产生野指针

free 可以对 为NULL 的指针执行多次操作,非null 不行

不同使用域中的相同名字的函数不算函数重载,小心隐势类型转换,比如 fun(int ) fun (float) 此时fun(0.5)就会编译报错。

函数重载不依靠返回值,因为有事不使用函数返回值。

基类和子类如果有相同名字的函数,当参数不同时,无论是否有virtual 基类函数被隐藏

基类和子类如果有相同名字的函数,当参数也相同,而且不是vitrual修饰,此时基类函数被隐藏

#1 个字节 最高位为1  结果是 2 的7次方 = 128字节

  2 个字节  最高位为1  结果是 2的15次方 = 32768 个字节=   32K

  1M = 1,048,576字节

  4 个字节  最高位为1  结果是 2的31次方 = 2,147,483,648 个字节=  2G = 2048M

# stl 中 容器  map 不是线程安全, 多线程操作同一个map得枷锁,因为map是红黑树list,动态开辟空间。

1迭代器控制函数advance的距离参数不需要自己控制,超出元素的范围会停在最后的参数。但是如果元素内size为0时该函数会停在那;

2  map拷贝

        map::iterator begObj = all.objCnt.objCnt.begin(), endObj = begObj;
        advance(begObj, hasCount), advance(endObj, count + hasCount);
        **std::copy(begObj, endObj, std::inserter(st.objCnt.objCnt, st.objCnt.objCnt.begin()));
         st.objCnt.all = all.objCnt.objCnt.size();

3 vector.reserve(n)  保证向量可以存放n个元素,如果n大于vector.capacity重新开辟空间。

4 . 以;结尾的是语句,没有;的是类型

5.climits 头文件中的宏,这个类型极限值。

C++ 零散记录_第1张图片

6.C++11  {} 也可以初始化基本类型,使用{} 可以和 类的类型初始化相同。在使用 { }赋值不是想赋的值不能缩减,也就是不能赋变量,如果是变量可能会导致赋的值与被赋值类型不匹配。

7.cout  << hex  让cout以16进制输出整形 ,8进制cout<< oct  改为10进制cout << dec。

8.char 在默认情况下是否有unsigned 不一定。

9.C++11 新增类型 char16_t  aa = u'q', char32_t aa= U'q';

10.C++ 11 auto 自动类型, 主要用于迭代器。

11.数组只能在建立时初始化,数组直接不能相互赋值。

12.C++数组初始化可以省略 =, char buf[]  {}赋值里面可以为空, 也可以这样int buf[10]  {1},为初始化都为0

13.cin.get(char, size)读取到回车换行符号时不会读取之后然后扔掉,所以在cin.get(char,size)之后电影cin.get()读取一个换行符然后继续cin.get(char,size)

14.C++11 原始字符R"(xxxxxxxxxxxx)",   "( 与)" 是一对,如果字符中包含)"那么"()" 可以换位"*(xxxxxxxxxxxxxxx )*"

15.

16.共同体是匿名的,结构体可以直接使用共同体里面的变量,所以共同体外面的名字和里面的名字不能相同。C++ 零散记录_第2张图片 17.對空指針使用delete安全的,不要釋放已經釋放過的內存,这样是行为是不确定。声明是在编译时候分配内存,new是在运行时候分配内存。

18.指针可以和整数相加可以(p指针)p = p + 1,数组不可以(p数组名) p = p + ,因为数组名是常量。

19.++a效率大于a++,以为后缀字符为为a产生临时变量,在临时变量加1,而前缀是直接加1.指针是可以++的

20.strcmp是进行ascii比较,参数1大于参数2结果大于0.

21.if else 和switch 相比如果选项大于2 使用switch,switch效率更快

22.编译阶段进行类型转换检测,比如1.2345e10转换为int型的错误,这种检测是为静态类型检测。

23.void (char *arr ) {arr = (int*)malloc(sizeof(int) * size); }  这样会失败
虽然传入的时候是把地址给了函数的第一个参数arr,但是由于malloc重新对地址进行了赋值,所以之后的操作也就不是对原来参数的操作了。

24 二级数组做参数指针  char[3][4] ; void fun(char arg[][4], int len)  , void fun(char (*arg)[], int len), 第二个参数len=3. const 只能用于一级指针。

25.函数指针数组 double *  f1 (char*buf, int) f1  ,    double * (*p[3])(char *buf, int )={f1, f2,f3};   f2和f3与f1相同,  调用:*p[0](p,l);

26.使用typedef 进行定义函数指针 typedef  double * (*fun_p)(char*,int)   ,  ep:fun_p   p1;

27.递归函数,和一些过大的函数不会编译成内联函数;而有的编译器没启用这种特性。

28.对于形参类型为const的,如果实参不匹配,者此行为按值传递。

29.C++ 新增加右值引用, 标识符为&&

30. 区分函数重载, 是C++中的修饰名称机制, 使用函数参数类型对名称进程加密。

31虚函数的机制是函数指针.

32.模板函数是在编译的是时候由编译器根据不同的类型编译出很多函数。

33 可变参数

string SqlCondition(int n, ...)

{

    va_list ap;

    va_start(ap, n);

    string sql_condit;

    for (int i = 0; i < n; ++i){

        sql_condit += va_arg(ap, char*);

    }

    va_end(ap);

    return sql_condit;

}

34 模板函数分为隐性实例,显示具体化template <> void swap(int a, int b)指定类型,这两种都是声明。 或者是在 调用时候swap(a,b),显示实例化template  void Swap(int a, int b)这种都是在调用时指定类型。在同一文件(转换单元)中同事使用显示实例化和显示具体化会报错。

35 在全局变量使用static变量进行初始化,但有时候static变量自己的初始化未进行,所有导致全局变量初始化失败。一直解决办法是把全局变量声明为指针,在main函数里面对全局指针初始化,因为此时static变量肯定初始化完成。

36 C++ STL 库  容易 List  的size  是线性不是常量, 除了List容器其他都是常量

37 类中成员变量可以是引用,但是必须在构造函数时初始化。

38 虚函数的目的 是基类指针调用派生类, 只有是指针或者多态才可能运用虚函数。本类调用虚函数相当于调用普通函数。 虚函数是继承的关系,重载是平级的关系。继承时 B:public A, B*b -> 调用的b中的函数,不会调用A 的虚函数。

39 关键参数不要用默认值!!

40 多线程加锁的操作中。公用的变量在初始化时可以晚点放入共享的地址,减少一次锁,没有争抢的锁不会浪费时间,只会占用cpu资源

41  

template
void print2(pair &v)
{
    cout << "V2.A:" << v.second.a;

}

 for_each(tmpMap.begin(), tmpMap.end(), print3); 第一个参数需要const,不然编译报错左值需要const

你可能感兴趣的:(c++,c++,开发语言)