1.某文件中定义的静态全局变量(或称静态外部变量)其作用域是?
答:本文件,静态全局变量限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
2.如何判断一段程序是由C编译程序还是由C++编译程序编译的?
答:
#ifdef__cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
这个没搞懂
3.C++函数中值的传递方式有哪几种?
答:C++函数的三种传递方式为:值传递、指针传递和引用传递。
区别:
a.指针有自己的内存空间,引用只是起一个别名;
b.sizeof计算指针大小为4,而引用则是引用对象的大小;
c.可以有const指针,但是没有const引用;
d.指针可以被初始化为NULL,而引用必须被初始化,且必须是一个已有对象的引用;
e.指针可以有多级指针(**p),而引用只有一级。
4.
class A
{
virtual void func1();
void func2();
}
class B :class A
{
void func1(){
cout<<"fun1 in class B"<<endl;}
virtual void func2(){
cout<<"fun2 class B"<<endl;}
}
A. A中的func1和B中的func2都是虚函数
B.A中的func1和B中的func2都不是虚函数
C.A中的func2是虚函数,B中的func1不是虚函数
D.A中的func2不是虚函数,B中的func1是虚函数。
答:A
5.C和C++有什么不同?
6.C和C++中struct有什么区别
区别 | Protection行为 | 能否定义函数 | |
---|---|---|---|
C | 无 | 否,但可以有函数指针 | |
C++ | 有,默认是private | 可以 |
7.C++中的struct和class有什么区别?
答:从语法上讲,class和struct做类型定义时只有两点区别:
8.这个写法对吗?为什么?
int id[sizeof(unsigned long)];
正确,这个sizeof是编译时运算符号,编译时就可确定了,可以看成和机器相关的常量。
9.“new” 在C++中是___?
关键字和运算符,malloc是库函数,不在编译器控制范围之内;new是运算符,在编译器控制范围只内。调用malloc时,从堆中申请内存;调用new时,从堆中申请内存并为内存调用构造函数。
备注:
C++程序在执行时,将内存大方向划分为4个区域
10.多态的作用?
多态是在不同继承关系的类对象,去调同一函数,产生了不同的行为。
就是说,有一对继承关系的两个类,这两个类里面都有一个函数且名字、参数、返回值均相同,然后我们通过调用函数来实现不同类对象完成不同的事件。
但是构成多态还有两个条件:
1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用
2.接口重用,为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性的正确调用。
11.多态类的虚函数表时Compile—Time,还是Run-Time时建立的?
答:虚函数表是在编译期就建立了,各个虚拟函数在时被组织成了一个虚拟函数的入口地址的数组,而对象的隐藏成员—虚拟函数表指针实在运行期,也是就构造函数被调用时进行初始化的,这是实现多态的关键。
12.面向对象的三个基本特征,并简单叙述
13.main函数执行之前,还会执行什么代码?
全局对象的构造函数会在main函数之前执行。
14 内存的分配方式有几种?
15.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
从作用域看:
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。
局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
从分配内存空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间
全局变量和局部变量的区别是作用域不同,全局变量从定义位置开始到程序结束,而局部变量只限定义的函数内可使用,全局变量在数据段,而局部变量在栈,局部 变量在函数结束时内存空间就被系统收回,所以要返回的数组或字符串不要用局部变量定义
16.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++应用什么实现?
C用宏定义,C++用inline.(内联函数)。
17.有了malloc/free为什么还要new/delete?
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。他们都可用来申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在消亡之前还是要自动执行析构函数。由于malloc/free。因此C++语言需要一个能够完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
18.如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。你是怎么处理内存耗尽的?
19.用C++写一个程序,如何判断一个操作系统是16位还是32位的?
定义一个指针p,打印出sizeof§,如果节后是4,则表示该操作系统是32位,打印结果是2,表示是16位。
20.用C++写一个程序,如何判断一个操作系统是16位还是32位的?布恩那个用sizeof()函数
unsigned int a=~0;
if(a>65536)
{
cout<<"32 bit"<<endl;
}
else
{
cout<<"16 bit"<<endl;
}
21.为什么需要使用堆,使用堆空间的原因?
直到运行时才知道一个对象需要多少内存空间;不知道对象的生存期到底有多长。
22.错误的转义字符是(A)
A.’\091’
B.’\’
C.’’
D.’’
A:不是八进制数。
23.若数组名作实参而指针变量作形参,函数调用实参传给形参的是(D)
A.数组的长度
B.数组第一个元素的值
C.数组所有元素的值
D.数组第一个元素的值
PS:一般还要把数组元素个数传传进去
24.有了malloc/free为什么还要new/delete ?
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可以孕育申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc./free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前 要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于Malloc/free.。因此C++语言需要一个能动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。z注意new/delete不是库函数。
25请讲一讲析构函数和虚函数的用法和作用?
析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命周期结束的时候,由系统自动调用。有释放内存空间的作用。虚函数是C++多台的一种表现,使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
26.如果ClassA中定义并实现虚函数 int fun(void),ClassB中也实现了该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void )不是虚函数,情况又如何?为什么?
第一问调用的是B的。第二问调用A的。虚函数只能借助于指针或者引用来达到多态的效果。
27.引用和指针有什么区别?
28.你觉得如果不使用常量,直接在程序中填写数字或者字符串,将会有什么麻烦?
29.在C++中有没有纯虚构造函数?
构造函数不能是虚的。只能有虚的析构函数。
30.fclose一个打开过一次的FILE*fp指针会有什么结果,并请解释。
导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。
31.重载(overload)、重写(override)、重定义(redefinition)的区别?
名称 | 名字空间 | 区别 |
---|---|---|
重载 | 同一名字空间 | 是指允许存在多个同名函数,而这些函数的参数表不同。 |
重定义/隐藏 | 不同名字空间 | 用于继承,派生类与基类的函数同名,屏蔽基类的函数 |
重写/覆盖 | 不同名字空间 | 用于继承,子类重新定义父类虚函数的方法 |
32.C++是不是类型安全的?
不是,类型的指针可以进行强制的类型转换。
33.C++是不是所有的动作都是main()引起的?如果不是,请举例。
不是,比如全局变量的初始化,就不是由main函数引起的。
举例:
class A{
};
A a;//a的构造函数先执行
int main(){
}
35.C++中virtual与inline的含义分别是什么?
在基类成员函数的声明之前加上virtual关键字,意味着将该成员函数声明为虚函数 inline与函数的定义体放在一起,使得该函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。
虚函数的特点:如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启动动态联编。
内联函数的特点:使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。
36.const关键字,有哪些作用?