1,全局,静态,局部变量
作用域:生存周期
{
全局变量:全部文件。程序运行时初始化,程序结束后销毁。
静态变量:当前文件。程序运行时初始化,程序结束后销毁。
静态局部变量:局部。函数第一次运行时初始化,程序结束后销毁。
}
2,如何让类只能在栈或堆上初始化
原理就在于将栈或堆上初始化的必要函数私有化
栈:重载new和delete操作符,设置为protected(防止子类无法使用)。
new operator=operator new(申请空间)+类的构造函数+返回类指针。
堆:将析构函数设为private,最好定义一个函数在delete类的对象之前删除类的数据成员中的指针。
3,全局变量与局部变量同名
就近原则,在局部变量作用域内,局部变量替换掉全局变量。同理用于函数中形参与类的数据成员同名
4,构造函数与初始化列表初始化区别
必须放在初始化列表中的三种情况:
(1)const修饰的常量成员,只能初始化不能赋值。
(2)引用类型,引用必须在定义的时候初始化,且不能重新赋值。
(3)没有默认构造函数的类类型,初始化列表不必调用默认构造函数初始化,而是直接调用拷贝构造函数初始化。
由于性能问题可以放在初始化列表中的情况:
构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。
初始化列表处于初始化阶段,其作用是在计算阶段之前,指定类成员变量的初始化方式。
Test2使用构造函数初始化会调用Test1的构造函数与赋值运算符
Test2使用初始化列表初始化则直接调用Test1的拷贝构造函数即可
因此性能方面使用初始化列表相当于少了一次调用默认构造函数的过程。
5,运算符求加法
int Add (int a , int b)
{
if(0==b)//没有进位
return a;
int sum,carry;
sum = a ^ b;//不会进位的位置相加
carry = (a & b)<<1;//会进位的左移一位(相当于进位)
return Add(sum + carry);//将进位后的数与不会进位的数再次相加
}