现在的位置: 首页 > 综合 > 正文

面向对象程序设计:构造函数

2014年02月05日 ⁄ 综合 ⁄ 共 2937字 ⁄ 字号 评论关闭

------------------------
构造函数
------------------------
构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。

★使用构造函数

在下面的示例中,定义了一个具有一个简单的构造函数,名为 Taxi 的类。然后使用 new 运算符来实例化该类。在为新对象分配内存之后,new 运算符立即调用 Taxi 构造函数。

示例

public class Taxi
{
    public bool isInitialized;
    public Taxi()
    {
        isInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        System.Console.WriteLine(t.isInitialized);
    }
}

不带参数的构造函数称为“默认构造函数”。无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。

★私有构造函数

私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例。

示例

public class Counter
{
    private Counter() { }
    public static int VCount;
    public static int MCount()
    {
        return ++VCount;
    }
}

class TestCounter
{
    static void Main()
    {
        // Counter aCounter = new Counter();// Error
        Counter.VCount = 100;
        Counter.MCount();
        System.Console.WriteLine("{0}", Counter.VCount);
        //int s=Counter.MCount();
        //System.Console.WriteLine("{0}", s);
    }
}

声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。

★静态构造函数

静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。静态构造函数具有以下特点:

○静态构造函数既没有访问修饰符,也没有参数。

○在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。

○无法直接调用静态构造函数。

○在程序中,用户无法控制何时执行静态构造函数。

示例

在此示例中,类 Bus 有一个静态构造函数和一个静态成员 Drive()。当调用 Drive() 时,将调用静态构造函数来初始化类。

public class Bus
{
    static Bus()
    {
        System.Console.WriteLine("The static constructor invoked.");
    }

    public static void Drive()
    {
        System.Console.WriteLine("The Drive method invoked.");
    }
}

class TestBus
{
    static void Main()
    {
        Bus.Drive();
    }
}

★复制构造函数

与有些语言不同,C# 不提供复制构造函数。如果您创建了新的对象并希望从现有对象复制值,您必须自行编写适当的方法。

示例

在本示例中,Person类包含一个构造函数,该构造函数接受另一个 Person 类型的对象作为参数。然后此对象的字段中的内容将分配给新对象中的字段。

class Person
{
    private string name;
    private int age;
    public Person(Person previousPerson)
    {
        name = previousPerson.name;
        age = previousPerson.age;
    }
    public Person(string name, int age)
    {
        //如果去掉this则参数名就不能和字段名相同
        this.name = name;
        this.age = age;
    }
    public string Details
    {
        get
        {
            return name + " is " + age.ToString();
        }
    }
}

class TestPerson
{
    static void Main()
    {
        Person person1 = new Person("George", 40);
        Person person2 = new Person(person1);
        System.Console.WriteLine(person2.Details);
    }
}

------------------------
 析构函数
------------------------
析构函数用于析构类的实例。不能在结构中定义析构函数。只能对类使用析构函数。析构函数有如下特点:

○ 一个类只能有一个析构函数。

○ 无法继承或重载析构函数。

○ 无法调用析构函数。它们是被自动调用的。

○ 析构函数既没有修饰符,也没有参数。

○ 声明析构函数时前面加一个“~”

示例:

下面的示例创建三个类,这三个类构成了一个继承链。类 First 是基类,Second 是从 First 派生的,而 Third 是从 Second 派生的。这三个类都有析构函数。在 Main() 中,创建了派生程度最大的类的实例。注意:程序运行时,这三个类的析构函数将自动被调用,并且是按照从派生程度最大的到派生程度最小的次序调用。

class First
{
    ~First()
    {
        System.Console.WriteLine("First析构函数");
    }
}

class Second: First
{
    ~Second()
    {
        System.Console.WriteLine("Second析构函数");
    }
}

class Third: Second
{
    ~Third()
    {
        System.Console.WriteLine("Third析构函数");
    }
}

class TestDestructors
{
    static void Main()
    {
        Third t = new Third();
    }
}

 

百思特网络 www.bestwl.com

抱歉!评论已关闭.