C/C++/C#面试题精选(2)

发布时间:2017-3-26 15:18:38 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"C/C++/C#面试题精选(2)",主要涉及到C/C++/C#面试题精选(2)方面的内容,对于C/C++/C#面试题精选(2)感兴趣的同学可以参考一下。

原文地址:http://blog.csdn.net/cadcisdhht/article/details/6193071 题目(六):运行下列C++代码,输出什么? struct Point3D {         int x;         int y;         int z; };   int _tmain(int argc, _TCHAR* argv[]) {         Point3D* pPoint = NULL;         int offset = (int)(&(pPoint)->z);           printf("%d", offset);         return 0; } 答案:输出8。由于在pPoint->z的前面加上了取地址符号,运行到此时的时候,会在pPoint的指针地址上加z在类型Point3D中的偏移量8。由于pPoint的地址是0,因此最终offset的值是8。 &(pPoint->z)的语意是求pPoint中变量z的地址(pPoint的地址0加z的偏移量8),并不需要访问pPoint指向的内存。只要不访问非法的内存,程序就不会出错。 题目(七):运行下列C++代码,输出什么? class A { public:         A()         {                 Print();         }         virtual void Print()         {                 printf("A is constructed./n");         } };   class B: public A { public:         B()         {                 Print();         }           virtual void Print()         {                 printf("B is constructed./n");         } };   int _tmain(int argc, _TCHAR* argv[]) {         A* pA = new B();         delete pA;           return 0; } 答案:先后打印出两行:A is constructed. B is constructed. 调用B的构造函数时,先会调用B的基类及A的构造函数。然后在A的构造函数里调用Print。由于此时实例的类型B的部分还没有构造好,本质上它只是A的一个实例,他的虚函数表指针指向的是类型A的虚函数表。因此此时调用的Print是A::Print,而不是B::Print。接着调用类型B的构造函数,并调用Print。此时已经开始构造B,因此此时调用的Print是B::Print。 同样是调用虚拟函数Print,我们发现在类型A的构造函数中,调用的是A::Print,在B的构造函数中,调用的是B::Print。因此虚函数在构造函数中,已经失去了虚函数的动态绑定特性。 题目(八):运行下列C#代码,输出是什么? namespace ChangesOnString {     class Program     {         static void Main(string[] args)         {             String str = "hello";             str.ToUpper();             str.Insert(0, " WORLD");               Console.WriteLine(str);         }     } } 答案:输出是hello。由于在.NET中,String有一个非常特殊的性质:String的实例的状态不能被改变。如果String的成员函数会修改实例的状态,将会返回一个新的String实例。改动只会出现在返回值中,而不会修改原来的实例。所以本题中输出仍然是原来的字符串值hello。 如果试图改变String的内容,改变之后的值可以通过返回值拿到。用StringBuilder是更好的选择,特别是要连续多次修改的时候。如果用String连续多次修改,每一次修改都会产生一个临时对象,开销太大。 题目(九):在C++和C#中,struct和class有什么不同? 答案:在C++中,如果没有标明函数或者变量是的访问权限级别,在struct中,是public的;而在class中,是private的。                 在C#中,如果没有标明函数或者变量的访问权限级别,struct和class中都是private的。struct和class的区别是:struct定义值类型,其实例在栈上分配内存;class定义引用类型,其实例在堆上分配内存。 题目(十):运行下图中的C#代码,输出是什么? namespace StaticConstructor {     class A     {         public A(string text)         {             Console.WriteLine(text);         }     }       class B     {         static A a1 = new A("a1");         A a2 = new A("a2");           static B()         {             a1 = new A("a3");         }           public B()         {             a2 = new A("a4");         }     }       class Program     {         static void Main(string[] args)         {             B b = new B();         }     } } 答案:打印出四行,分别是a1、a3、a2、a4。 在调用类型B的代码之前先执行B的静态构造函数。静态函数先初始化类型的静态变量,再执行静态函数内的语句。因此先打印a1再打印a3。接下来执行B b = new B(),即调用B的普通构造函数。构造函数先初始化成员变量,在执行函数体内的语句,因此先后打印出a2、a4。 博主何海涛对本博客文章享有版权。网络转载请注明出处。整理出版物请和作者联系。有任何建议或意见,欢迎在评论中告知,或者加我微博http://weibo.com/zhedahht与我交流。

上一篇:Android中进行图像旋转
下一篇:UVa 11636 Hello World! (数学)

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款