委托构造函数

什么是委托构造函数

  • 委托其他构造函数帮忙构造,构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码目的。
  • 构造函数的特性都适合委托构造函数,没有返回值,可以有一个或多个参数,有函数体。委托构造函数也有一个成员初始值列表和函数体。委托构造函数内,成员初始值列表的唯一入口便是类名本身。
 1 #include <iostream>
 2 class Base
 3 {
 4 public:
 5     int value1;
 6     int value2;
 7     Base()      //目标构造函数
 8     {
 9         value1 = 1;
10     }
11     Base(int value) : Base()    //委托构造函数
12     {//委托Base()构造函数
13     
14         value2 = value;
15     };

 C++explicit关键字

  • 只能用于修饰只有一个参数的类构造函数,其作用是表明该构造函数是显示的,跟它对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下声明是隐式的
class CxString  // 没有使用explicit关键字的类声明, 即默认为隐式声明  
{  
public:  
    char *_pstr;  
    int _size;  
    CxString(int size)  
    {  
        _size = size;                // string的预设大小  
        _pstr = malloc(size + 1);    // 分配string的内存  
        memset(_pstr, 0, size + 1);  
    }  
    CxString(const char *p)  
    {  
        int size = strlen(p);  
        _pstr = malloc(size + 1);    // 分配string的内存  
        strcpy(_pstr, p);            // 复制字符串  
        _size = strlen(_pstr);  
    }  
    // 析构函数这里不讨论, 省略...  
};  
  
    // 下面是调用:  
  
    CxString string1(24);     // 这样是OK的, 为CxString预分配24字节的大小的内存  
    CxString string2 = 10;    // 这样是OK的, 为CxString预分配10字节的大小的内存  
    CxString string3;         // 这样是不行的, 因为没有默认构造函数, 错误为: “CxString”: 没有合适的默认构造函数可用  
    CxString string4("aaaa"); // 这样是OK的  
    CxString string5 = "bbb"; // 这样也是OK的, 调用的是CxString(const char *p)  
    CxString string6 = 'c';   // 这样也是OK的, 其实调用的是CxString(int size), 且size等于'c'的ascii码  
    string1 = 2;              // 这样也是OK的, 为CxString预分配2字节的大小的内存  
    string2 = 3;              // 这样也是OK的, 为CxString预分配3字节的大小的内存  
    string3 = string1;        // 这样也是OK的, 至少编译是没问题的, 但是如果析构函数里用free释放_pstr内存指针的时候可能会报错, 完整的代码必须重载运算符"=", 并在其中处理内存释放 

在c++中,如果构造函数只有一个参数时,那么在编译的时候就会有一个缺省的转换操作;将该操作构造函数对应数据类型的数据转换为该类对象。如果要避免这种操作,则应该使用explicit关键字

class CxString  // 使用关键字explicit的类声明, 显示转换  
{  
public:  
    char *_pstr;  
    int _size;  
    explicit CxString(int size)  
    {  
        _size = size;  
        // 代码同上, 省略...  
    }  
    CxString(const char *p)  
    {  
        // 代码同上, 省略...  
    }  
};  
  
    // 下面是调用:  
  
    CxString string1(24);     // 这样是OK的  
    CxString string2 = 10;    // 这样是不行的, 因为explicit关键字取消了隐式转换  
    CxString string3;         // 这样是不行的, 因为没有默认构造函数  
    CxString string4("aaaa"); // 这样是OK的  
    CxString string5 = "bbb"; // 这样也是OK的, 调用的是CxString(const char *p)  
    CxString string6 = 'c';   // 这样是不行的, 其实调用的是CxString(int size), 且size等于'c'的ascii码, 但explicit关键字取消了隐式转换  
    string1 = 2;              // 这样也是不行的, 因为取消了隐式转换  
    string2 = 3;              // 这样也是不行的, 因为取消了隐式转换  
    string3 = string1;        // 这样也是不行的, 因为取消了隐式转换, 除非类实现操作符"="的重载  

 


posted @ 2022-07-26 14:48  陈尔东  阅读(376)  评论(0)    收藏  举报