关于“构造函数”中的几个小问题,也许面试会问到哦~

   构造函数这玩意也是面试官经常会问到的东西,我们知道一个类的状态初始化就全靠它了,下面提几个小问题。

Q:我看到Web项目里面通常都有一个BasePage页面,其中构造函数里面做了权限验证,

     请问为什么要这么做。

A:  既然这么做了,那么设计者肯定就知道了一个原则就是实例构造器中,父类构造器先于子类执行,那么这个先执行就可

     以做很多有意思的事情,比如你说的权限验证,可能有人会问为什么要先于子类执行,刚才我也说了,构造函数是用于

     初始化本类状态的,这也叫“先扫屋子再请客”的道理吧~,然后风雨兼程的回溯到Object的ctor中。好了,现在来回答

     你的问题,先把这个问题简化一下,就不用web项目来演示了。

public class Program
    {
        static void Main(string[] args)
        {
            var b = new Bird();

            Console.Read();
        }
    }

    public class Animal
    {
        public Animal()
        {
            Console.WriteLine("running first... i'm animal, all must be running after me.");
        }
    }

    public class Bird : Animal
    {
        public Bird()
        {
            Console.WriteLine("the next... i'm a cute bird.");
        }
    }

可以看到,确实Animal于Bird先执行,可能有人会问,那Animal调用的是谁的ctor呢?当然就是Object了,我们可以看看IL:

 

Q: 既然你说构造函数用于初始化类的初始状态,那么请问下,我现在有一串这样的

    json:{"Name":"smart","Age":2}。实体类如下图,请问我的json序列化后,Age=?

[Serializable]
    public class Bird
    {
        private string name = "smart";

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        private int age = 2;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        public Bird()
        {
            Age = 5;
        }
    }

A:其实这个问题的关键在于,反序列化的时候是否会调用构造函数的问题,先来通过Reflector看下源码,发现并没有代码,觉得

    有点小奇怪,就用ILSpy反编译一下,同样也没有代码,不可否认,底层肯定是有代码执行的,要么反编译不出来,要么clr用了

    其他的方式,反正我们看不到实现源代码,如果大家有什么好意见可以帮帮我,谢谢了

 

Reflector截图:

 

ILSpy截图:

据资料说,里面最后调用了FormatterServices里面的GetSafeUninitializedObject来分配对象内存,分配完后就不走构造器

了,所以针对这个问题,只能记住了。最后为了验证一下,执行完代码之后确实没有走构造函数。

 

Q:我知道引用类型可以用构造器,那值类型为什么不能定义无参构造器?

A:这个问题问的好,编译器会根据性能考虑,不会调用值类型的构造函数,即使你强制的new一下也不会执行

namespace Sample
{
    public class Program
    {
        static void Main(string[] args)
        {
            Point point = new Point();
        }
    }

    public struct Point
    {
        public int Age;
    }
}

不过除非你自己显示定义有参构造函数,而且值类型有个特点就是读取之前必须初始化,否则会编译不通过。

 

Q:请问在类构造函数中能做单例吗?

A: 能不能做,就要看类构造器的特征了,我们知道类构造器跟实例构造器一样,他是用来初始化静态字段的,线程

     访问类构造器的时候内部会进行加锁处理,所以多个线程同时访问的时候,只会有一个线程执行了类构造器,所以

     确实可以。

时间: 2024-12-27 22:13:05

关于“构造函数”中的几个小问题,也许面试会问到哦~的相关文章

os-c++中运算符重载 这个小程序怎么不对呢

问题描述 c++中运算符重载 这个小程序怎么不对呢 #include using namespace std; class R{ public : int n; int d; R(int a,int b) { this->n=a; this->d=b; } }; ostream operator<< (ostream &os,R &r) { // os<<r.n<<endl; // os<<r.d<<endl;; os

C++编程规范之48:在构造函数中使用初始化代替赋值

摘要:     设置一次,到处是用:在构造函数中,使用初始化代替复制来设置成员变量,能够防止发生不必要的运行时操作,而输入代码的工作量则保持不变.     构造函数会在系统内部生成初始化代码.考虑如下代码: class Employee { string firstName, lastName; public: Employee(){ firstName ="Leo"; lastName = "Chu" } };     实际上,生成的构造函数代码将类似于: Emp

小菜鸟弱弱的问一句怎么在Microsoft Visual Studio 2010的form中的属性写事件啊?

问题描述 小菜鸟弱弱的问一句怎么在MicrosoftVisualStudio2010的form中的属性写事件啊?[img=http://b151.photo.store.qq.com/psb?/bfc51046-87e3-466f-b460-4730d42a104e/AmFVoa36OQhaKLSNbCVTQKU1ZIuT.nWqyYV*BAtxSnk!/b/YV5XAlrlNwAAYgICDVqaPQAA][/img]我想在我拖动外面的窗体的时候,里面的ListView的大小跟着一起变大变小怎

c++ 构造函数中调用虚函数的实现方法_C 语言

我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { public: A ():m_iVal(0){test();} virtual void func() { std::cout<<m_iVal<<' ';} void test(){func();} public: int m_iVal; }; class B : public A {

为什么不能再构造函数中执行大量的内存分配、文件读写等复杂操作??

问题描述 为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作?? 大婶们啊:为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作??? 解决方案 可以啊!谁告诉你不行的? 只是在构造函数做太复杂的操作,当出错时发现错误有时会很困难.特别是定义为全局变量时,程序还没有运行.就出错了. 解决方案二: 构造函数主要进行一些初始化工作,复杂的工作放到成员函数中处理,这样比较符合OOP设计 解决方案三: 以牺牲对象分配的时间来换取代码的简单行· 是可以的·! 但是不推荐 解决方案四: 这

ASP网页开发过程中的几个小技巧

过程|技巧|网页 摘要:本文介绍了用ASP进行网页设计过程中的几个小技巧,包括新闻栏的创建和自动更新,以及公告栏的创建.使用和维护.指明了解决此类问题的大致方法. Abstract: We introduce several tricks when using Active Server Pages to design homepages. These include the creation and automatic updating of news columns, as well as

设计实例分析:白社会中三个较小的设计点

今天,3月21日,世界睡眠日,恰巧是个周末,劳累了一周的大家有没有在家里睡懒觉呢~提醒大家,关注睡眠质量就是关注生活质量,关注睡眠就是关注健康. 好了,回到正题,在前作(一)和(二)中谈到了真心话和任务的设计,这次谈谈白社会中三个较小一点的设计点. 一.好友新鲜事新增提醒 在白社会的首页中,分量最重的就是这个好友新鲜事了,为了保证信息流的快速直接,我们采用了"推"的模式,并且直接即时的将信息推到用户的面前,这就是所谓的实时Feed了,这其实是一种非常酷的体验,信息获取快速直接,也省了刷

构造函数中的this指针

-------------------------------原理------------------------------- 某些人认为不应该在构造函数中使用this指针,因为这时this对象还没有完全形成. 但是,只要小心,是可以在构造函数中使用this指针的: ●在函数体中 ●初始化列表中 因为"对象还没有完全形成"不意味着"什么都没有". 在进入构造函数(及其chaining)之前,Compiler会: ●给class的instance分配内存 ●建立运行

SQL Server 2000中生成XML的小技巧

本文介绍一个SQL Server 2000中生成XML的小技巧. 以前在介绍SQL2k的时候已经提到了SQL2k对XML的支持,使用for XML语句就可以很容易的把执行的结果转化为一个XML,这样可以在很大程度上提高系统运行效率和开发速度,详细的内容请参见Books Online. 但是在使用ADO(Required ADO 2.6)访问返回的XML的方式和原来的Recordset是有所不同的.如果你还是使用Recordset访问的话,只能得到一个Unicode格式的XML Schema,而无