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 类名&),用于对象复制初始化。

相关推荐
江华森14 分钟前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.15 分钟前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
运行时记录1 小时前
prompt-optimizer skill
算法
万法若空1 小时前
【数据结构-哈希表】哈希表原理
数据结构·算法·散列表
退休倒计时1 小时前
【每日一题】LeetCode 437. 路径总和 III TypeScript
算法·leetcode·typescript
老迟到的茉莉1 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
学逆向的1 小时前
汇编——内存
开发语言·汇编·算法·网络安全
tachibana22 小时前
hot100 翻转二叉树(226)
java·数据结构·算法·leetcode
lbb 小魔仙2 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_2 小时前
Java 线程池
java·开发语言