- 声明为const 的数据成员不能出现任何可能改变成员的操作,如:
- 常成员函数不能出现赋值语句不能调用非常成员函数。
- 常对象只能调用常成员函数。
- 类的常成员变量在构造函数中只能通过列表初始化的方式。
- 虚函数重新定义,函数返回类型,函数名,参数个数,参数类型,参数顺兴都必须与原函数一致。
- 函数重载,只有参数类型不同,或者参数个数不同,或者二者兼有,才能重载,返回值类型不算。
- 赋值兼容规则成立条件是派生类从其基类公有派生。
- 只有通过基类指针访问虚函数才是动态连编,获得运行时的多态。
- 内联函数不能是虚函数,虚函数在类内定义,编译时仍将其看做非内联的。
- 构造函数不可以为虚函数,析构函数通常为虚函数。因为如果new一个派生类的无名对象赋值给基类的一个指针,当用delete运算符撤销无名对象时,系统只能执行基类的析构函数,而不能执行派生类的析构函数
- 纯虚函数:virtual void show()=0;
- 拥有一个或多个纯虚函数的类为抽象类,抽象类不可以声明对象,可以声明指针和引用
- 编译时的多态通过 重载 模板 实现,运行时的多态通过 虚函数实现。
- reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足够大的整数类型之间的转换;从整数类型(包括枚举类型)到指针类型,无视大小。(相同bit位)
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = reinterpret_cast<int *>(p);
p1++;
p = reinterpret_cast<char *>(p1);
printf("result is %s\n", p);//result is to test something
class CTest
{
public:
CTest():m_chData(‘\0’),m_nData(0){ }
virtual void mem_fun() {} private:
char m_chData;
int m_nData;
static char s_chData;
};
char CTest::s_chData=’\0’;
32位操作系统
(1)若按4字节对齐sizeof(CTest)的值是多少? 12
(2)若按1字节对齐sizeof(CTest)的值是多少? 4
类占的内存空间:
- 空类占一个字节
- 非空类计算包括:变量,虚函数创建的虚表指针 。static不算,也没有空类占用的那一个字节。
方法重载(overload):
- 必须是同一个类
- 方法名(也可以叫函数)一样
- 参数类型不一样或参数数量不一样
方法的重写(override)两同两小一大原则: - 方法名相同,参数类型相同
- 子类返回类型小于等于父类方法返回类型,
- 子类抛出异常小于等于父类方法抛出异常,
- 子类访问权限大于等于父类方法访问权限
char a[]={0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8};
short* st=(short*) a;
int* it=(int *) a;
long long* ll=(long long *) a;
printf("%x\n%x\n%x\n", *st, *it, *ll);
这个代码的输出应该是?
答案是:
201
4030201
4030201
首先解释short, short占两个字节,所以指针指向两个字节,但是可能就好奇为什么是201不是102
这就涉及汇编字的传送 , 看下面这个汇编代码
如果0x1在10000H, 那么0x2在10001H, 所以0x2在高八位,0x1在低八位,即0000 0010 0000 0001 ,所以为201
int 同理,但是不明白long long 只取4位?还请高手赐教。