1. new
int *pia = new int[10]; // 10个未初始化int int *pia2 = new int[10](); // 10个值初始化为0的int
解析:
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数;
对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()
2. enum
enum string{ x1, x2, x3=10, x4, x5, } x;
解析:
如果是函数外定义那么是0
如果是函数内定义,那么是随机值,因为没有初始化
3.
unsigned char *p1; unsigned long *p2; p1=(unsigned char *)0x801000; p2=(unsigned long *)0x810000;
请问p1+5= 什么?p2+5= 什么?
解析:
801005 810014
p1指向字符型,一次移动一个字符型,1个字节;p1+5后移5个字节,16进制表示为5;
p2指向长整型,一次移动一个长整型,4个字节,p2+5后移20字节,16进制表示为14。
{ char每次移动1个字节;short移动2个字节 ;int , long ,float移动4个字节 ;double移动8个字节}
4.
void example(char acWelcome[]){ printf("%d",sizeof(acWelcome)); return; } void main(){ char acWelcome[]="Welcome to Huawei Test"; example(acWelcome); return; }
在32位机器中,输出是?
解析:4
此处为一个指针变量。32位系统的指针变量是一个int,也就是4个字节
c++中不允许隐式的数组拷贝,所以example的参数会被隐式地转为char*,故为4
若在函数体内,char a[5]="oo";
则sizeof代表数组大小,注意是声明范围的大小
5. 重载
多态性分为编译时多态性和运行时多态性,
编译时多态性通过静态编联完成,例如函数重载,运算符重载;
运行时多态性则是动态编联完成,主要通过虚函数来实现;
函数重载不需要是成员函数,在类外声明或定义的函数同样可以对其进行重载
重载的调用主要根据参数个数,参数类型,参数顺序来确定, 函数重载是忽略返回值的
方法重载(overload):
1.必须是同一个类
2方法名(也可以叫函数)一样
3参数类型不一样或参数数量不一样
方法的重写(override)两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
6.
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 ", p);
运行结果?
解析:
result is to test something
charstr[] = "glad to test something"; //定义字符串
char*p = str; //p指向字符串首地址,即字符'g'
p++; //p是char*类型,每次移动sizeof(char)字节,故此时p指向 'g'的下一个字符 'l'
int*p1 = reinterpret_cast<int*>(p); //指针p被重新解释为整型指针并被赋值给p1
p1++; //p1是int*类型, 每次移动sizeof(int)字节,故此时p1 指向 'l'后的第四个字符 't'
p = reinterpret_cast<char*>(p1); //指针p1被重新解释为字符型指针并被赋值给p
printf("result is %s
", p); //从't'开始输出字符串,即得到 "to test something"
7.
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’;
问:
(1)若按4字节对齐sizeof(CTest)的值是多少?
(2)若按1字节对齐sizeof(CTest)的值是多少?
请选择正确的答案。
解析: 12, 9
1 先找有没有virtual 有的话就要建立虚函数表,+4
2 static的成员变量属于类域,不算入对象中 +0
3 神马成员都没有的类,或者只有成员函数(一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节) +1
4 对齐法则,对大家都没有问题
2 static的成员变量属于类域,不算入对象中 +0
3 神马成员都没有的类,或者只有成员函数(一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节) +1
4 对齐法则,对大家都没有问题
8.
class A { public: void FuncA() { printf( "FuncA called " ); } virtual void FuncB() { printf( "FuncB called " ); } }; class B : public A { public: void FuncA() { A::FuncA(); printf( "FuncAB called " ); } virtual void FuncB() { printf( "FuncBB called " ); } }; void main( void ) { B b; A *pa; pa = &b; A *pa2 = new A; pa->FuncA(); ( 3) pa->FuncB(); ( 4) pa2->FuncA(); ( 5) pa2->FuncB(); delete pa2; }
程序的输出结果?
解析:
FuncA called FuncBB called FuncA called FuncB called
父类指针指向子类实例对象,调用普通重写方法时,会调用父类中的方法。而调用被子类重写虚函数时,会调用子类中的方法。
9.
int FindSubString( char* pch ) { int count = 0; char * p1 = pch; while ( *p1 != '