C++ 知识点12 构造函数

C++ 构造函数


一、构造函数是什么

核心特点(必背)

  1. 函数名 和类名完全相同

  2. 没有返回值 (连 void 都不用写)

  3. 创建对象时 自动调用

  4. 作用:初始化成员变量

最简基础代码

cpp 复制代码
#include <iostream>
using namespace std;
​
class Person
{
public:
    // 构造函数:和类名同名,无返回值
    Person()
    {
        cout << "构造函数自动调用" << endl;
    }
};
​
int main()
{
    // 创建对象 → 自动执行构造函数
    Person p;
    return 0;
}

输出:

cpp 复制代码
构造函数自动调用

二、无参构造函数

规则

  • 没有参数

  • 不写构造时,编译器自动生成一个默认无参构造(空函数体)

cpp 复制代码
#include <iostream>
using namespace std;
​
class Student
{
public:
    // 无参构造
    Student()
    {
        cout << "无参构造执行" << endl;
        // 初始化默认值
        id = 0;
    }
    int id;
};
​
int main()
{
    Student s; // 自动调用无参构造
    cout << "id = " << s.id << endl;
    return 0;
}

⚠️ 易错点:

cpp 复制代码
Student s();   // 不是创建对象!是函数声明,千万别这么写

无参实例化直接写:Student s;


三、有参构造函数

用来创建对象时直接给成员赋初值

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
​
class Person
{
public:
    string name;
    int age;
​
    // 有参构造
    Person(string n, int a)
    {
        name = n;
        age = a;
        cout << "有参构造执行" << endl;
    }
​
    void show()
    {
        cout << "姓名:" << name << " 年龄:" << age << endl;
    }
};
​
int main()
{
    // 调用有参构造
    Person p("张三", 18);
    p.show();
​
    // C++11 列表初始化写法
    Person p2{"李四", 20};
    p2.show();
​
    return 0;
}

输出:

cpp 复制代码
有参构造执行
姓名:张三 年龄:18
有参构造执行
姓名:李四 年龄:20

四、构造函数重载

一个类可以有多个构造函数,参数个数 / 类型不同,构成重载。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
​
class Person
{
public:
    string name;
​
    // 无参构造
    Person()
    {
        name = "未知";
        cout << "无参构造" << endl;
    }
​
    // 有参构造
    Person(string n)
    {
        name = n;
        cout << "有参构造" << endl;
    }
};
​
int main()
{
    Person p1;         // 匹配无参
    Person p2("王五"); // 匹配有参
    return 0;
}

五、初始化列表初始化(重点、考试必考)

作用

  1. 构造函数执行前先初始化成员

  2. 初始化 const 成员、引用成员、成员对象 必须用初始化列表

语法

cpp 复制代码
类名(参数) : 成员1(值1), 成员2(值2)
{
    函数体
}

代码示例:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Person
{
private:
    string name;
    int age;
public:
    // 初始化列表写法
    Person(string n, int a) : name(n), age(a)
    {
        cout << "构造函数体执行" << endl;
    }

    void show()
    {
        cout << name << " " << age << endl;
    }
};

int main()
{
    Person p("赵六", 22);
    p.show();
    return 0;
}

关键规则

  • 初始化顺序 按类中定义顺序,不是列表书写顺序

  • const 成员、引用成员 只能用初始化列表初始化

cpp 复制代码
class Test
{
private:
    const int x;
public:
    // 必须在列表初始化const成员
    Test() : x(100) {}
};

六、拷贝构造函数

作用

一个已有对象 去初始化新对象

格式

cpp 复制代码
类名(const 类名& 旧对象)

代码演示:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Person
{
private:
    string name;
    int age;
public:
    // 普通有参构造
    Person(string n, int a) : name(n), age(a) {}

    // 拷贝构造函数
    Person(const Person& p)
    {
        name = p.name;
        age = p.age;
        cout << "拷贝构造执行" << endl;
    }

    void show()
    {
        cout << name << " " << age << endl;
    }
};

int main()
{
    Person p1("小明", 19);
    
    // 调用拷贝构造
    Person p2(p1);  
    p2.show();

    // 等价简写
    Person p3 = p1; 

    return 0;
}

什么时候会自动调用拷贝构造

  1. 用旧对象初始化新对象

  2. 对象作为函数值传递参数

  3. 函数返回对象


七、默认构造函数规则

  1. 自己不写任何构造 → 编译器自动生成默认无参构造

  2. 只要写了一个有参构造 ,编译器 不再生成默认无参构造

代码演示坑:

cpp 复制代码
class Student
{
public:
    // 写了有参构造
    Student(int a)
    {
        cout << a << endl;
    }
};

int main()
{
    // Student s;  // 报错!没有无参构造了
    Student s(10); // 只能调用有参
    return 0;
}

八、构造函数核心总结(背诵版)

  1. 构造函数 名同类名、无返回值、创建对象自动调用

  2. 分:无参、有参、重载、拷贝构造

  3. 初始化列表:优先初始化,必须初始化 const / 引用 / 成员对象;

  4. 写了有参构造,编译器不再提供默认无参构造

  5. 拷贝构造格式:类名(const 类名&),用于对象复制初始化。

相关推荐
2601_962218615 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
2601_966949655 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin5 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
anew___5 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
吞下星星的少年·-·5 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
滕州市燕猫虎计算机科技工作室个体工商户5 小时前
Java锁
java·开发语言
多加点辣也没关系6 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2336 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21036 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客7 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm