C++笔试笔记

来源:互联网 发布:java多线程并发测试 编辑:程序博客网 时间:2024/05/16 09:15
@@1

·由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。
·如果找不到匹配的catch子句,那么当前方法得到一个”未截获异常”的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误传播将被继续下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。
@@2 strcpy 
extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指 由NULL结束的字符串 复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw “Invalid argument(s)”; //[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!=’\0′); //[4]
return strDestCopy;
}

@@3
JVM在整个jdk中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的java运行环境,因此也就
虚拟了计算机,操作系统装入JVM是通过jdk中的java.exe来完成的,通过以下4步:
1,创建JVM装在环境和配置
2,装载JVM.dll
3,初始化JVM.dll并挂载到JNIENV(JNI调用接口)实例。
4,调用JNIENV实例,装载并处理class类。

@@4 volatile
@@5 SIZEOF
@@6 函数指针、指针函数、数组指针、指针数组
@@7 STL = Standard Template Library vector,map
@@8 正则表达式
@@9 SQL
@@10 指针数组、数组指针
@@11 #define Max(a,b) ( a-b)?a:b
@@ 12 ping过程
@@ 13操作系统lru存储算法
@@ 14深度广度
@@ 15 内存泄露 
内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,就是溢出内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态

内存泄露是指程序中间动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况,重起计算机可以解决,但是也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件引起的。
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

@@ 16
char* p = “12345 “;

printf( “%c “, *p++);
printf( “%c “, *p++);

为什么输出 1, 2, 而不是 2, 3 ?
答:
对于表达式中的++而言,记住一个顺序:

后置++在表达式后求值
前置++在表达式前求值

因此题目变为:

char* p = “12345 “;

printf( “%c “, *p);
p++;
printf( “%c “, *p);
p++;

@@ 17
基类指针、派生类指针与他们的关系

基类指针可以指向基类对象;
派生类指针可以指向派生类对象;
基类指针可以指向派生类对象(无需强制转换),但只能引用基类中有的成员;
派生类指针指向基类对象,会引发语法错误。但派生类指针通过强制转换可指向基类对象。可是该动作很危险:若引用对象中不村在的派生类成员,会得到错误的结果。
@@ 18

malloc/free是c/C++语言的标准库函数;new/delete是c++的运算符,都可以用申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建是要自动执行Constructor函数,对象在消亡之前要自动执行Destructor函数。由于malloc/free是库函数不是运算符,不在编译器控制权限之内,不能够把Constructor及Destructor任务加于malloc/free.
@@ 19
1 ) main() { int a=3;printf(“%d\n”,(a=4*5,a*2));}

a=4*5—结果a为20
(a=4*5,a*2)—结果为a*2,即40
所以,结果是40
2 ) main()
{
printf(“Hello world !\n”);
int a = 6;
printf(“—–%d\n”,a=(2*44,a*3));
system(“pause”);
}
a输出为18;
3 )
main()
{
printf(“Hello world !\n”);
int a;
printf(“—–%d\n”,a=(2*44,a*34,a*33,a*3));
system(“pause”);
}

@@ 20
为什么析构函数要声明成virtual
对象构造的顺序是先基类,再派生类.
析构的顺序是先派生类,再基类.
如果基类没有虚函数,则不存在多态,在用基类指针/引用绑定到一个派生类对象时,该对象就被当成了基类对象,也就是对象被截断了.
所以delete基类指针时,直接调用基类析构函数,从而派生类对象没有得到释放.
为了保证在继承关系中保证派生类可以正确的释放,所以通常把可能要被继承的类的析构函数写成虚拟函数(每个类都会有析构函数).除非你保证该类不会被继承.
而如果有其他成员函数已经是虚拟函数了,那么析构函数是否虚拟都无关紧要了.

@@21
c++函数调用前必须声明吗
无论C还是C++,在函数调用之前如果函数没有定义,都要先声明!
可能有的编译器有所谓隐式声明的語法。就是默认地认为那个函数的参数就是你传的参数,并且函数返回 int。不过无论如何,显式声明都是个好习惯,不仅编译器不用揣测函数类型,而且看的人也能看的清楚些。 吗

0 0
原创粉丝点击