C++的一些小问题(一)
char a[]="liuj";定义的是一个字符串,字符串后面以'\0'结尾,所以 sizeof(a)=5
char b[]={'l','i','u','j'};定义的是一个字符数组,所以sizeof(b)=4
在c语言中,字符串和字符数组都可以用a[0],a[1]……来调用其中的某个元素。而在perl中,字符串标量$a="liuj",是无法用下标来访问的。如果一定想访问的话,可以用split("",$a)把字符串一个一个的分开。
CString类的应用是因为开始c++还没有确定标准,有标准后就开始使用string类。使用string类要记得加上头文件<string>和using namespcae std; string类的赋值可以使用=直接赋值,也可以用构造函数的形式赋值str("liuj")。

得到a=8,b,c,d,e=4
const 有什么用途?(请至少说明两种)
答:(1)可以定义 const 常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?
答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。由于编译后的名字不同,C++程序不能直接调用C 函数。所以C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。
最常见的一道c++笔试题
考察内存











请问运行Test函数会有什么样的结果?
答:程序崩溃。
函数参数都是局部变量,改变这些参数的值不会影响调用函数中的值。局部变量被存储在栈中,函数返回时,栈被自动清空。malloc分配的内存不会被自动释放,p指向自由存储区中的内存块,离开该指针的作用域时,该内存块不会被自动归还给自由存储区。
因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。
p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:(1)能够输出hello (2 )Test函数中也未对malloc的内存进行释放。(3)GetMemory避免了试题1的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句 p = (char *) malloc( num ); 后未判定内存是否申请成功,应加上: if ( *p == NULL ) { ...//进行申请内存失败处理 }
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
请问运行Test函数会有什么样的结果?
答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用。
指出以下代码的问题








答案:没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
请写出一下代码输出

This is A::Func1
This is B::Func1
This is C::Func1
因为使用了虚函数,每次调用都是在运行时判断指向了哪种类型的实例。