快捷搜索: 王者荣耀 脱发

c++ 类的特殊成员函数:委托构造函数(二)

1. 介绍

C++11 引入了委托构造函数的特性,其目的是在类内部的一个构造函数中调用同一个类的另一个构造函数来完成初始化。这种方式可以避免代码重复,提高代码的可读性和维护性。

2. 委托构造

Engineer.cpp

Engineer::Engineer():Engineer("00000","IT Engineer"){
          
   
    std::cout << "无参构造 ..." << std::endl;
}

Engineer::Engineer(std::string ID):Engineer(ID,"Software Engineer"){
          
   
    std::cout << "有参构造 --> 单 ..." << std::endl;;
}
Engineer::Engineer(std::string ID,std::string post):ID{
          
   ID},post{
          
   post}{
          
   

    std::cout << "有参构造 --> 双 ..." << std::endl;
    std::cout << "--" <<post << " 的工号是 : "<< ID<<"--"<< std::endl;
}

第一个构造函数使用了委托构造函数的方式,通过调用拥有两个参数的构造函数来完成初始化,同时将 ID 的值设为"00000",post 的值设为 “IT Engineer”。

第二个构造函数也使用了委托构造函数的方式,通过调用第三个构造函数来完成初始化,将 post 的值设为 “software Engineer”。

Create_object.cpp

#include "Engineer.h"

int main(){
          
   


    Engineer Engineer_object1;
    std::cout << Engineer_object1.ID << " " << Engineer_object1.post << std::endl;
    std::cout << "------------------------------------" << std::endl;
    Engineer Engineer_object2("00001");
    std::cout << Engineer_object2.ID << " " << Engineer_object2.post << std::endl;
    std::cout << "------------------------------------" << std::endl;
    Engineer Engineer_object3("00002","Architecture engineer");
    std::cout << Engineer_object3.ID << " " << Engineer_object3.post << std::endl;

    return 0;
};

运行结果:

有参构造 --> 双 ...
--IT Engineer 的工号是 : 00000--
无参构造 ...
00000 IT Engineer
------------------------------------
有参构造 --> 双 ...
--Software Engineer 的工号是 : 00001--
有参构造 --> 单 ...
00001 Software Engineer
------------------------------------
有参构造 --> 双 ...
--Architecture engineer 的工号是 : 00002--
00002 Architecture engineer

从运行结果来看,委托构造函数先调用默认构造函数 ,再执行本函数的函数体的内容.

3. 使用场景

当类有多个构造函数,并且它们都有一些公共代码时,可以使用委托构造函数,将这一部分公共代码写在一个公共构造函数中,然后在所有的构造函数中委托给它进行处理,增加代码重用性.

class Foo {
          
   
public:
	Foo() : Foo(0, 0) {
          
   }
    Foo(int x) : Foo(x, 0) {
          
   }
    Foo(int x, int y) : x_(x), y_(y), z_(0) {
          
   
        // 公共代码
    }
private:
    int x_;
    int y_;
    int z_;
};
经验分享 程序员 微信小程序 职场和发展