C++ 构造函数
一、构造函数是什么
核心特点(必背)
-
函数名 和类名完全相同
-
没有返回值 (连
void都不用写) -
创建对象时 自动调用
-
作用:初始化成员变量
最简基础代码
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;
}
五、初始化列表初始化(重点、考试必考)
作用
-
在构造函数执行前先初始化成员
-
初始化
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;
}
什么时候会自动调用拷贝构造
-
用旧对象初始化新对象
-
对象作为函数值传递参数
-
函数返回对象
七、默认构造函数规则
-
自己不写任何构造 → 编译器自动生成默认无参构造
-
只要写了一个有参构造 ,编译器 不再生成默认无参构造
代码演示坑:
cpp
class Student
{
public:
// 写了有参构造
Student(int a)
{
cout << a << endl;
}
};
int main()
{
// Student s; // 报错!没有无参构造了
Student s(10); // 只能调用有参
return 0;
}
八、构造函数核心总结(背诵版)
-
构造函数 名同类名、无返回值、创建对象自动调用;
-
分:无参、有参、重载、拷贝构造;
-
初始化列表:优先初始化,必须初始化 const / 引用 / 成员对象;
-
写了有参构造,编译器不再提供默认无参构造;
-
拷贝构造格式:
类名(const 类名&),用于对象复制初始化。