-
const符号常量:
(1)、const char *p
(2)、char const *p
(3)、char * const p
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量。
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
-
析构函数和虚函数的用法和作用?
析构函数的作用是当对象生命期结束时释放对象所占用的资源。析构函数用法:析构函数是特殊的类成员函数
它的名字和类名相同,没有返回值,没有参数不能随意调用也没有重载。只是在类对象生命期结束时有系统自动调用。
虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联遍。
-
堆和栈的区别
栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆:一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似。
-
头文件的作用是什么?
-
通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取出相应的代码。
-
头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
-
-
-
从静态存储区域分配。内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。如全局变量。
-
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。
-
从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活。
-
-
Float:const float EPSINON = 0.00001;
If((x>=.EPSINON)&&(x<=EPSINON)) 说明:不可将浮点变量用”==”或”!=”与数字比较,应该设法转化成”>=”或”<=”此类形式。
指针*p:if(p==NULL) if(p!=NULL)
-
以下为Windows NT下的32位C++程序,请计算sizeof的值
Char str[] = “Hello”;
Char *p = str;
Int n = 10
请计算:
Sizeof(str) = 6
Sizeof(p) = 4
Sizeof(n)=2
Void Func(char str[100])
{
请计算:sizeof(str) = 4
}
Void *p = malloc(100)
请计算:sizeof(p) = 4
-
#include <filename.h>和#include “filename.h”有什么区别
对于#include <filename.h>,编译器从标准库路径开始搜索filename.h,对于#include “filename.h”,编译器从用户的工作路径中开始搜索filename.h
-
Const有什么用途
-
可以定义const常量
-
Const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
-
-
在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”?
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void fee(int x,inty);
该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
C++提供了C连接交换指定符号extern “C”来解决名字匹配的问题。
-
内存思考题
Void GetMemory(char *p)
{
P = (char *)malloc(100);
}
Void Test(void)
{
Char *str = NULL;
GetMemory(str);
Strcpy(str,”hello world”);
Printf(str);
}//函数内的变量是独立于main的,对其改变不会影响main的变量
请问运行Test函数会有什么样的结果?
程序会崩溃,因为GetMemory并不能传递动态内存,Test函数中的str一直是NULL。
Strycpy(str,”hello world”);将使程序崩溃。
Char *GetMemory(void)
{
Char p[] = “hello world”;
Return p;
}
Void Test(void)
{
Char *str = NULL;
Str = GetMemory();
Printf(str);
}
请问Test函数会有什么样的结果?
可以是乱码。因为GetMemory返回的是指向”栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不知。
Void GetMemory2(char **p,int num)
{
*P = (char *)malloc(num);
}
Void Test(void)
{
Char *str = NULL;
GetMemory(&str,100);
Strcpy(str,”hello”);
Printf(str);
}
请问运行Test函数会有什么样的结果?
-
能够输出hello
-
内存泄露
Void Test(void)
{
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)语句不起作用。
-
头文件的作用是什么?
-
通过头文件来调用库功能。在很多场合,源代码不便(不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
-
头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能减轻程序员调试、改错的负担。
-
-
C++里面晃是不所有的动作都是main()引起的?如果不是,请举例
在运行C++程序时,通常从main()函数开始执行。因此如果没有main(),程序将不完整,编译器将指出未定义main()函数。
例外情况:如,在windows编程中,可以编写一个动态 连接库(DLL)模块,这是其他windows程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main()。用于专用环境的程序――如机器人中的控制器芯片――可能不需要main(),但常规的独立程序都需要main().
-
引用与指针的区别:
-
引用总是指向某个对象,定义时没有初始化是错误的;
-
给引用赋值是修改引用所关联的对象的值,所关联的对象不变。
-
-
从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。
-
1、Sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2、Sizeof是运算符,strlen是函数
3、Sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以换行符”