1.委托构造函数
委托构造函数出现的意义:
委托构造初始化能够减少代码的冗余的问题 使代码变得简洁 明朗
现在大家来看一个例子:
本代码采用了普通函数的构造方法 看起来简洁一些 但是并没有从实际上解决问题 尤其是对于
复杂数据类型的存储 比如String类型 已经发生了默认的构造初始化 所以这里产生了构造初始化的重复问题
拓展 String类型的默认初始化: 在C++中,String类的默认初始化将创建一个空字符串。也就是说,当声明一个String对象但没有给它赋初值时,它将自动初始化为空字符串。
委托构造函数的格式 代码实例:
#include <iostream> class MyClass { private: int value1; int value2; public: MyClass() : MyClass(0, 0) {} // 委托构造函数 MyClass(int v1, int v2) : value1(v1), value2(v2) {} void printValues() { std::cout << "value1: " << value1 << ", value2: " << value2 << std::endl; } }; int main() { MyClass obj; // 调用默认构造函数,也就是委托给另一个构造函数 obj.printValues(); // 输出:value1: 0, value2: 0 return 0; }
本代码就是Myclass()为委托构造函数 MyClass(int v1, int v2) : value1(v1), value2(v2) {}为代理构造函数 委托构造函数采用初始化列表的方式调用代理构造函数 (注意只能用初始化列表的形式 使用函数体内部调用会报错)
执行顺序 先执行代理构造函数的 初始化列表 然后再执行代理构造函数的结构体 最后执行委托构造函数主体
委托构造函数注意事项:
1.每个构造函数都可以委托另一个构造函数代为代理
2.不要递归循环委托
3.代理构造函数执行完成后 委托构造函数的主体出现了异常 则自动调用该类型的析构函数
4.如果一个函数为委托构造函数 那么其初始化列表里就不能对数据成员和基类进行初始化
委托构造函数应用:
class Person { public: Person() : Person("", 0) { } // 默认构造函数委托给带参数的构造函数 Person(const std::string& name, int age) : name(name), age(age), address("") { } // 带参数的构造函数 Person(const std::string& name, int age, const std::string& address) : name(name), age(age), address(address) { } // 带参数的构造函数 private: std::string name; int age; std::string address; };
委托模板构造函数代码示例:
template <typename T> class Vector { public: Vector() : Vector(0) { } // 默认构造函数委托给带参数的构造函数 explicit Vector(size_t size) : size_(size), data_(new T[size]) { } template <typename U> Vector(const Vector<U>& other) : size_(other.size()), data_(new T[other.size()]) { for (size_t i = 0; i < size_; ++i) { data_[i] = static_cast<T>(other[i]); } } private: size_t size_; T* data_; };
2.继承构造函数
在普通的类和对象中 普通的父类的构造函数是不会继承的 只有父类的无参构造函数才是可以系统默认调用的 而其他的构造函数都需要手写代码来显示调用父类的构造函数 我们需要编译器来帮助我们生成简单代码(想着办法偷懒)
语法规则 核心是使用using关键字
代码示例:
class Parent { public: Parent(int value) { /* 父类构造函数 */ } }; class Child : public Parent { public: using Parent::Parent; // 继承父类的构造函数 // 可以添加子类特有的成员和方法 };
于C++11及更高版本,可以使用
using
关键字来实现继承构造函数。这个特性叫做“继承构造函数”。通过使用
using
关键字,子类可以将父类的构造函数引入到子类作用域中,从而实现调用父类构造函数。在上面的示例中,子类
Child
使用using Parent::Parent
的方式将父类Parent
的构造函数引入到子类作用域中。这样,在创建子类对象时,就可以直接使用父类的相应构造函数进行初始化。需要注意的是,如果父类有多个重载的构造函数,在使用继承构造函数时需要根据需要选择合适的基类构造函数进行引入。
继承构造函数能够简化代码并提高可读性,避免了手动编写委派构造函数的繁琐过程。
好啦 本篇介绍构造函数的内容就到这里啦
在这里小编想推荐一个课程