1、联合输出
union
{
int i;
char x[ 2 ];
}a;
void main()
{
a.x[ 0 ] = 10 ;
a.x[ 1 ] = 1 ;
printf( " %d " ,a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是0x010A)
2、头文件中的ifndef/define/endif 的作用?
答:防止该头文件被重复引用。
3、面向对象的三个基本特征,并简单叙述之?
1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public)
2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。
3. 多态:系统能够在运行时,能够根据其类型确定调用哪个重载的成员函数的能力,称为多态性。
4、多态的作用?1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。
5、有哪几种情况只能用intializationlist 而不能用assignment?
答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。
6、 C++是不是类型安全的?
答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。
7、main 函数执行以前,还会执行什么代码?
答案:全局对象的构造函数会在main 函数之前执行,gcc的编译命令等等。
8、class A{}; ---->sizeof(A) = 1
为了给对象一个地址以便区分同一类的不同对象(如A arr[10])
9、比较c++四种类型转换
dynamic_cast 主要用于执行“安全的向下转型(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制转型,也是唯一可能有重大运行时代价的强制转型。
static_cast 可以被用于强制隐型转换(例如,non-const 对象转型为 const 对象,int 转型为 double,等等),它还可以用于很多这样的转换的反向转换(例如,void* 指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个 const 对象转型为 non-const 对象(只有 const_cast 能做到),它最接近于C-style的转换。
const_cast 一般用于强制消除对象的常量性。它是唯一能做到这一点的 C++ 风格的强制转型。
reinterpret_cast 是特意用于底层的强制转型,导致实现依赖(implementation-dependent)(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制转型在底层代码以外应该极为罕见。
10、分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。
int : if ( a == 0 ) or if (0 == a)
float : const float EXP = 0.000001
if ( a < EXP && a >- EXP)
pointer : if ( a != NULL) or if (a == NULL)
11、类成员函数的重载、覆盖和隐藏区别?
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
12、如何打印出当前源文件的文件名以及源文件的当前行号?
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的
13、如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
对于未编译的:
cout << " c++ " ;
#else
cout << " c " ;
#endif
对于已经编译的:
nm命令查看函数名,C++会修改。 nm test.o
14、