C++笔记之构造函数

以下部分截图取自慕课网相关课程

一、构造函数的规则和特点:

  1. 构造函数在对象实例化是被自动调用;
  2. 构造函数与类同名;
  3. 构造函数没有返回值;
  4. 构造函数可以有多个重载形式;
  5. 实例化对象时仅用到一个构造函数;
  6. 构造函数的参数可以有默认值,如果构造函数也使用类外定义,那么在函数实现部分不用写默认值,这一点和普通类外定义函数的默认值是一样的;
  7. 当用户没有定义构造函数时,编译器自动生成一个构造函数,这个函数什么也不做。

二、构造函数的初始化列表

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初始化列表的特性

  1. 初始化列表先于构造函数执行;
  2. 初始化列表只能用于构造函数或拷贝构造函数;
  3. 初始化列表可以同时初始化多个数据成员;
    由于初始化列表的效率高、速度快,推荐使用初始化列表来初始化数据成员。

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;
}

上面的代码的执行结果为:
这里写图片描述

拷贝构造函数也可以使用初始化列表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值