1、inti=1;
voidmain(){
inti=i;//i是一个未定义的值
}
2、类型转换
C++定义了一组内置类型对象之间的标砖转换:
如果一个操作数的类型是longdouble,另一个操作数将转换成longdouble
如果都不是longdouble,其中一个是double,则另一个转换成double
同理,一个是float,其他的转换成float
如果两个操作数都不是3种浮点数类型之一,它们一定是某种整值类型,在确定共同的目标提升类型之前,编译器将在所有小于int的整值类型上施加一个被称为整值提升的过程。
3、运算符问题
1)unsignedchara=0xA5;
uUnsignedcharb=~a4+1;
coutb;//结果是,因为寄存器是16位的
2)用一个表达式,判断一个数X是否是2N次方,不可用循环
!(X(X-1))
3)下面代码:
return(xy)+((x^y)1)(,)=
4)不用if等判断语句,找出两个数中较大的值
intmax=((a+b)+abs(a-b))/2
5)如何将两个值进行交换,并且不适用任何中间变量
a=a^b;b=a^b;a=a^b;
4、C和C++的关系
1)在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”
C++提供了C连接交换指定符号解决名字匹配问题
2)头文件中的ifndef/define/endif
防止该头文件被重复引用
预处理、const与sizeof1、宏定义
1)用一个宏定义FIND求一个结构体struc里某个变量相对struc的偏移量:
#defineFIND(struc,e)(size_t)(((struc*)0)-e
指针和引用1、classA{public:inta;A(){a=1;}voidprint(){couta;};
classB:publicA{public:inta;B(){a=2;}};
Bb;b.print();coutb.a;//结果是12
2、函数指针
1)float(**def)[10]def是一个二级指针,它指向的是一个一维数组的指针,数组元素是float
2)double*(*gh)[10]gh是一个指针,它指向一个一维数组,数组元素都是double*
3)double(*f[10])()函数指针数组,f是一个数组,元素是函数的指针
4)int*((*b)[10])一维数组的指针
5)Long(*fun)(int)函数指针
6)Int(*(*F)(int,int))(int)F是一个函数的指针,指向的函数的类型是有两个int参数并且返回一个函数指针的函数,返回的函数指针指向有一个int参数且返回int的函数
7)int(*ptr)[]指向整形数组的指针
8)int*ptr[]指针数组
9)int(*a[10])(int)一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整形值
3、指针数组和数组指针
1)inta[]={1,2,3,4,5}
int*ptr=(int*)(a+1)//a+1指向数组后面
cout*(ptr-1);//输出5
2)C++中有了malloc/free,为什么还需要new/delete
对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前需要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。New和delete不是库函数,是运算符
4、指针和句柄
1)句柄和指针的区别和联系是什么?
句柄是一种指向指针的指针
句柄和指针其实是两个截然不同的概念。Windows系统用句柄标记系统资源,隐藏系统的信息。你只要知道有这个东西,然后去调用就行了,它是个32bit的unit。指针则标记某个物理内存地址,两者是不同的概念
STL模板与容器1、泛型编程
1)什么事泛型编程?
STL代表用一致的方式编程是可能的。它并不是试图用C++编程,只是试图找到一种正确的方式来处理软件,寻找一种可以表达我们的想法的语言而已。泛型编程是一种基于发现高效率算法的最抽象表示的编程方法,也就是说,以算法为起点并寻找能使其工作有效率的最一般的必要条件集,并且这些必要条件有多种不同的实现方式。
继承与接口1、以下代码的输出结果是什么?
classA{protected:intm_data;public:A(intdata=0){m_data=data;
intGetData(){returndoGetData();}virtualintdoGetData(){returnm_data;}};
classB:publicA{protected:intm_data;public:B(intdata=1){m_data=data;
intdoGetData(){returnm_data;}};
classC:publicB{protected:intm_data;public:C(intdata=2){m_data=data;}}
c.GetData()—C未定义,调用B中,B未定义,调用A中。A中为虚,调用B中
c.A::GetData()—A为虚,C未定义,调用B中
c.A::doGetData()—直接调用A中
2、三种继承方式
公有继承:基类的公有成员和保护成员可见,基类的公有成员和保护成员作为派生类得成员时,它们都保持原有的状态;基类的私有成员不可见,基类的私有成员仍然是私有的。在公有继承时,派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类的公有成员和保护成员。
私有继承:基类的共有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类访问。
保护继承:基类的公有成员和保护成员都作为派生类的保护成员。
例:classParent{public:Parent(intvar=-1){m_nPub=var;m_nptd=var;m_nptr=var;}
public:intm_nPub;protected:intm_nptd;private:intm_nPtr;};
classChild1:publicParent{public:intGetPub(){returnm_nPub;};
intGetPtd(){returnm_nPtd;};intGetPtr(){returnm_nPtr;};};
classChild2:protectedParent{public:intGetPub(){returnm_nPub;};
intGetPtd(){returnm_nPtd;};intGetPtr(){returnm_nPtr;};};
classChild3:privateParent{public:intGetPub(){returnm_nPub;};
intGetPtd(){returnm_nPtd;};intGetPtr(){returnm_nPtr;};};
Child1cd1;Child2cd2;Child3cd3;intnVar=0;
cd1.m_nPub=nVar;
cd1.m_nPub=nVar;//父类保护变量,可以被公有继承派生类对象访问但不可以修改
nVar=cd1.GetPtd();
cd2.m_nPub=nVar;//保护继承的派生类对象不可以直接修改父类的公有变量
nVar=cd2.GetPtd();
cd3.m_nPub=nVar;
nVar=cd3.GetPtd();//私有继承的派生类对象可以通过函数访问父类的保护变量
位运算与嵌入式编程1、建立一个联合体下面的程序运行结果是什么?
union{chara;inti;}u;u.i=0xf0f1f2f3;
couthexu.i;//f0f1f2f3
couthexint(u.a);//f3内存中数据低位字节存入低地址,数据的地址用低地址表示
2、写出程序运行结果
int*pa=NULL;int*pb=pa+15;
printf(“%x”,pb);//15*4=60,60的十六进制结果是3C
3、嵌入式编程
中断服务子程序(ISR):ISR不能反悔一个值;ISR不能传递参数;ISR应该是短而有效率的,在ISR中做浮点运算是不明智的;在ISR中一般不使用printf().
4、关键字volatile有什么含义?一个参数可以既是const又是volatile吗?指针可以是volatile吗?
定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会假设这个变量的值了,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
可以既是const又是volatile,一个例子是只读寄存器
可以是指针,一个例子是当一个终端服务子程序修改一个指向buffer的指针时
5、设置一绝对地址的值
Int*ptr;ptr=(int*)0x67a9;*ptr=0xaa55;
6、unsignedint北京手术治疗白癜风费用北京哪有看白癜风的