一些小知识点
- 输出数组内容
a[1]=*(a+1)=*(1+a)=1[a]
cout<<1[a];//也可以
- 堆的大小是没有限制的,而栈有,一般为8MB,因此不宜在线程中嵌套太深的函数或太大的局部变量。
- 结构体变量占用的内存并不是各部分相加,而是必须是其中最大数据类型的整数倍,目的是为地址对齐,提高读写速度。
- C++中使用多态时,不要使用派生类给父类初始化,否则会导致对象切断。
- 每个派生类都调用自己直接基类的构造函数,但最终派生类的构造函数负责调用虚基类的构造函数,可以不是直接基类!(一般每个类都由自己的构造函数构造,但虚基类由最终派生类负责构造)。所有虚基类都由最终派生类的构造函数初始化,如果创建了最终派生类对象,那么将忽略通过子对象的构造函数对虚基类的现有调用。
- 友元函数可以访问类中所有数据!友元关系不可以传递。
- 顶层const:不可使用*p更改内容;
- 底层const:不可改变p指向,但可以改变*p内容
- 静态成员函数不可以调用非静态成员函数,但可以调用构造函数;
在c++中,由于面向对象的思维,它与C语言中的作用有一些不同,有了类中静态成员的说法。静态成员不属于对象,而属于类。不创建对象也可调用。从代码形式上来说没有任何区别。普通类成员函数与静态成员函数的区别在于普通成员函数有一个隐藏的调用参数(this)指针。所以就是说静态成员函数没有对象也可调用。
对类的静态和非静态函数的不同的调用要求决定了它们在使用上的方便程度:
非静态成员函数要通过对象调用,所以要求首先建立一个对象;而静态成员函数可不建立对象就可以被使用。一般对象也可以调用静态成员函数;
另外,如果类的成员函数想作为回调函数来使用,一般情况下只能将它定义为静态成员才行。
- decltype : 对出现过的数据推断类型,用于声明新变量
Decltype(preNum) newNum;
- 使用静态函数/静态变量的好处
1.限定作用域在本文件
2.不会与其他文件中的函数名称冲突
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
- 函数指针 :double (*fac)(int a,int b) : 相比函数多个括号
- 用户空间和内核空间
32bitCPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0-3G是用户态空间,3-4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中。其逻辑地址其划分为:3G用户空间和1G内核空间 - 使用引用传参时,也可以触发多态,但不可以给基类取派生类的别名;
形参为基类引用,可以传递派生类实参;但反之不行; - 编译阶段分为编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码;
- 一个初始化的奇葩方法
- 判断小数相等