C++ 学习(4)——构造函数

C++构造函数详解及与Python中__init__的对比

在面向对象编程中,构造函数是类的一个重要组成部分。它的核心作用是在创建对象时进行初始化操作。本文将系统梳理C++中构造函数的概念、种类与使用方式,并与Python中类的初始化函数__init__进行对比,帮助读者建立跨语言的理解。

一、C++中的构造函数

构造函数(Constructor)是C++类中的一个特殊成员函数,用于在对象创建时执行初始化逻辑。它的最大特点是:函数名与类名相同,且没有返回值类型(也不能写 void)。

1.1 构造函数的基本写法

class Person {
public:
    string name;
    int age;

    // 构造函数
    Person(string n, int a) {
        name = n;
        age = a;
    }
};

当我们创建对象时:

Person p("张三", 20);

会自动调用构造函数。

1.2 构造函数的类型

  • 默认构造函数:无参数构造函数

    Person() {}
    
  • 有参构造函数:带参数构造函数

    Person(string n, int a) { ... }
    
  • 拷贝构造函数:通过另一个对象来构造新对象

    Person(const Person& p) { ... }
    
  • 移动构造函数(C++11及以后):用于资源转移优化

    Person(Person&& p) { ... }
    

1.3 初始化列表

C++ 推荐使用初始化列表来初始化成员变量,特别是对于const或引用成员。

Person(string n, int a) : name(n), age(a) {}

1.4 特殊注意事项

  • 如果你没有定义任何构造函数,编译器会自动提供一个默认构造函数
  • 一旦你定义了一个构造函数,编译器就不再生成默认构造函数,需要你手动添加。
  • 构造函数可以被重载,即同名但参数不同。

二、Python中的初始化方法 __init__

Python中的类使用__init__方法作为初始化逻辑,类似于C++中的构造函数。这个方法在使用类创建对象时被自动调用。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

调用方式:

p = Person("张三", 20)

特点:

  • __init__并不是构造函数本身,Python的真正构造函数是__new__,但大多数情况下不需要关心。
  • __init__方法的第一个参数必须是self,表示实例自身。
  • Python中没有拷贝构造、移动构造等复杂机制,拷贝通常使用模块函数如copy.copy()

三、C++构造函数与Python __init__ 对比总结

特性 C++ Python
名称 与类同名 固定为__init__
是否自动调用
参数支持 支持重载(函数名相同,参数不同) 通过默认参数或*args, **kwargs实现
默认构造函数 自动生成(条件限制) 若未定义__init__,会自动生成空方法
拷贝构造 显式支持 通常需手动调用copy模块
初始化方式 构造函数体 或 初始化列表 __init__中通过self.xxx赋值
构造器限制 可设为private 无法设为私有,但可用单例/工厂控制

四、小结

构造函数是对象生命周期的起点。C++中构造函数种类多样、可重载、控制灵活,适合精细的资源管理。而Python中的__init__则更简洁直观,符合动态语言的特性。

posted @ 2025-07-08 11:05  seekwhale13  阅读(30)  评论(0)    收藏  举报