面相对象

构造函数

预计阅读时间2 分钟 8 views

前言

在C#中,构造函数类似于一个在创建类的对象时自动调用的方法。与普通方法不同,构造函数有一些独特的特点:

  • 构造函数的名称与类名相同。
  • 构造函数没有返回类型。

作用

构造函数用于初始化类的对象。在创建对象时,构造函数会被自动调用,确保对象在使用之前被正确初始化。

使用场景

构造函数用于以下场景:

  • 初始化对象的状态。
  • 设置对象的初始值。
  • 实现类的初始化逻辑。

示例

无参构造函数

无参构造函数是指没有参数的构造函数。示例如下:

using System;

namespace ConstructorExample {
    class Car {
        // 无参构造函数
        public Car() {
            Console.WriteLine("无参构造函数被调用");
        }

        static void Main(string[] args) {
            // 创建对象时调用无参构造函数
            new Car();
            Console.ReadLine();
        }
    }
}

输出

无参构造函数被调用

在上述示例中,Car 类中定义了一个无参构造函数,并在 Main 方法中创建了一个 Car 对象,从而调用了这个构造函数。

带参构造函数

带参构造函数允许在创建对象时传入参数。示例如下:

using System;

namespace ConstructorExample {
    class Car {
        string brand;
        int price;

        // 带参构造函数
        public Car(string theBrand, int thePrice) {
            brand = theBrand;
            price = thePrice;
        }

        static void Main(string[] args) {
            // 使用带参构造函数创建对象
            Car car1 = new Car("法拉利", 700000);
            Console.WriteLine("品牌: " + car1.brand);
            Console.WriteLine("价格: " + car1.price);
            Console.ReadLine();
        }
    }
}

输出

品牌: 法拉利
价格: 700000

在这个示例中,Car 类中的构造函数接受两个参数,用于初始化对象的 brandprice 属性。

默认构造函数

如果类中没有定义任何构造函数,C# 会自动生成一个默认构造函数。示例如下:

using System;

namespace ConstructorExample {
    class Program {
        int number;

        static void Main(string[] args) {
            // 使用默认构造函数创建对象
            Program p1 = new Program();
            Console.WriteLine("默认值: " + p1.number);
            Console.ReadLine();
        }
    }
}

输出

默认值: 0

在这个示例中,由于没有定义构造函数,C# 自动创建了一个默认构造函数,初始化 number 字段为其默认值0。

复制构造函数

复制构造函数用于通过复制另一个对象的数据来创建新对象。示例如下:

using System;

namespace ConstructorExample {
    class Car {
        string brand;

        // 构造函数
        public Car(string theBrand) {
            brand = theBrand;
        }

        // 复制构造函数
        public Car(Car c1) {
            brand = c1.brand;
        }

        static void Main(string[] args) {
            // 使用构造函数创建对象
            Car car1 = new Car("保时捷");
            Console.WriteLine("car1 品牌: " + car1.brand);

            // 使用复制构造函数创建对象
            Car car2 = new Car(car1);
            Console.WriteLine("car2 品牌: " + car2.brand);

            Console.ReadLine();
        }
    }
}

输出

car1 品牌: 保时捷
car2 品牌: 保时捷

在这个示例中,我们使用复制构造函数创建了一个与 car1 具有相同 brand 属性的 car2 对象。

私有构造函数

私有构造函数使用 private 访问修饰符来限制对象的创建。示例如下:

using System;

namespace ConstructorExample {
    class Car {
        // 私有构造函数
        private Car() {
            Console.WriteLine("私有构造函数被调用");
        }

        static void Main(string[] args) {
            // 尝试调用私有构造函数
            // Car car1 = new Car();  // 编译错误
            Console.ReadLine();
        }
    }
}

错误

error CS0122: 'Car.Car()' is inaccessible due to its protection level

在这个示例中,Car 类的构造函数是私有的,因此无法在 Main 方法中创建 Car 对象。

静态构造函数

静态构造函数在类的第一个对象创建之前自动调用。示例如下:

using System;

namespace ConstructorExample {
    class Car {
        // 静态构造函数
        static Car() {
            Console.WriteLine("静态构造函数被调用");
        }

        // 默认构造函数
        public Car() {
            Console.WriteLine("默认构造函数被调用");
        }

        static void Main(string[] args) {
            // 创建对象时调用静态构造函数
            Car car1 = new Car();
            Car car2 = new Car();
            Console.ReadLine();
        }
    }
}

输出

静态构造函数被调用
默认构造函数被调用
默认构造函数被调用

在这个示例中,静态构造函数仅在程序运行期间调用一次,而后续的对象创建仅调用默认构造函数。

构造函数重载

C# 支持构造函数重载,即在一个类中定义多个构造函数。示例如下:

using System;

namespace ConstructorOverload {
    class Car {
        // 无参构造函数
        public Car() {
            Console.WriteLine("无参构造函数被调用");
        }

        // 带一个参数的构造函数
        public Car(string brand) {
            Console.WriteLine("带一个参数的构造函数被调用");
            Console.WriteLine("品牌: " + brand);
        }

        static void Main(string[] args) {
            // 调用无参构造函数
            Car car1 = new Car();
            Console.WriteLine();

            // 调用带参构造函数
            Car car2 = new Car("兰博基尼");
            Console.ReadLine();
        }
    }
}

输出

无参构造函数被调用

带一个参数的构造函数被调用
品牌: 兰博基尼

在这个示例中,我们定义了两个构造函数:一个无参数构造函数和一个带参数构造函数,根据传入的参数不同,C# 会调用对应的构造函数。

结语

构造函数在C#中用于初始化类的对象,是面向对象编程中的一个重要概念。通过掌握不同类型的构造函数(无参、带参、复制、私有、静态及重载),可以灵活地控制对象的创建过程和初始化逻辑,从而编写出更加健壮和可维护的代码。

Leave a Comment

分享此文档

构造函数

或复制链接

内容