以下部分截图取自慕课网相关课程
一、构造函数的规则和特点:
- 构造函数在对象实例化是被自动调用;
- 构造函数与类同名;
- 构造函数没有返回值;
- 构造函数可以有多个重载形式;
- 实例化对象时仅用到一个构造函数;
- 构造函数的参数可以有默认值,如果构造函数也使用类外定义,那么在函数实现部分不用写默认值,这一点和普通类外定义函数的默认值是一样的;
- 当用户没有定义构造函数时,编译器自动生成一个构造函数,这个函数什么也不做。
二、构造函数的初始化列表
2.1初始化列表的形式
一个银行账户类Account,写在Account.h头文件中
#include <string>
#include <iostream>
using namespace std;
class Account {
public:
Account();//无参构造函数
Account(string name, int balance);//有参构造函数
string getName();//获取户主姓名
int getBalance();//获取账户余额
private:
const string m_strName;//数据成员,户主姓名,一旦开户,姓名就不能改变,所以定义成常量
int m_iBalance;//账户余额
};
下面的代码写在account.cpp源文件中
#include "Account.h"
#include <iostream>
#include <string>
using namespace std;
/*这里用到了初始化列表,括号里面的数据是静态的,数据成员首先被初始化列表里面的数赋值,如果函数体中再次改变数据成员的值,以最后的修改结果为准*/
Account::Account():m_strName("Tom"), m_iBalance(100) {
//m_iBalance = 999;
}
/*这里用到了初始化列表,括号里面的数据和参数列表相对应,根据不同的参数动态获得,数据成员首先被初始化列表里面的数赋值,如果函数体中再次改变数据成员的值,以最后的修改结果为准*/
Account::Account(string name, int balance):m_strName(name), m_iBalance(balance) {
m_iBalance = 999;
}
string Account::getName() {
return m_strName;
}
int Account::getBalance() {
return m_iBalance;
}
int main() {
Account ac;
cout << ac.getName() << endl;
cout << ac.getBalance() << endl;
Account ac1("Jerry", 521);
cout << ac1.getName() << endl;
cout << ac1.getBalance() << endl;
system("pause");
return 0;
}
2.2初始化列表的特性
- 初始化列表先于构造函数执行;
- 初始化列表只能用于构造函数或拷贝构造函数;
- 初始化列表可以同时初始化多个数据成员;
由于初始化列表的效率高、速度快,推荐使用初始化列表来初始化数据成员。
2.3初始化列表存在的必要性
以2.1中的Account类为例,里面有一个数据成员m_strName是常量,因此不能用普通的方法对其赋值,只能用初始化列表的方式对其进行赋值。
三、拷贝构造函数
在上面这张图片中我们可以看到,在main函数中实例化了3个Student类,但是结果却是只打印了一个“Student”,这个“Student”是在实例化stu1的时候打印的,而在实例化stu2和stu3的时候并没有打印,也就是在实例化stu2和stu3的时候并没有调用那个无参的构造函数。那么在实例化stu2和stu3的时候调用的哪个构造函数呢?答案就是拷贝构造函数。
如果没有自定义的拷贝构造函数,则系统自动生成一个默认的拷贝构造函数;当采用直接初始化或复制初始化实例化对象时,系统自动调用拷贝构造函数。
定义拷贝构造函数的格式:类名(const 类名 &变量名)
拷贝构造函数的使用方法:
//文件名为Student.h
#include <iostream>
#include <string>
using namespace std;
class Student {
public:
Student();//定义构造函数
Student(const Student &stu);//定义拷贝构造函数
private:
string m_strName;//定义数据成员
};
#include "Student.h"
Student::Student() {
cout << "调用构造函数" << endl;
}
Student::Student(const Student &stu) {
cout << "调用拷贝构造函数" << endl;
}
void test(Student stu) {
}
int main() {
Student stu1;//调用构造函数
Student stu2 = stu1;//调用拷贝构造函数
Student stu3(stu1);//调用拷贝构造函数
test(stu1);//当对象作为函数参数传递时,也会调用拷贝构造函数
system("pause");
return 0;
}
上面的代码的执行结果为:
拷贝构造函数也可以使用初始化列表。