当前位置: 首页 > news >正文

C++ 语言特性10 - 委托构造函数

1:什么是委托构造函数?

        在C++中,委托构造函数(Delegating Constructor)是一种特殊的构造函数,它在构造函数的初始化列表中调用同一个类中的另一个构造函数,从而实现代码的复用。这种特性在C++11中引入。

class MyClass {
public:// 委托构造函数MyClass(int x, int y) : MyClass(x) {// 委托给另一个构造函数}// 被委托的构造函数MyClass(int x) {// 初始化代码}
};

2. 委托构造函数在什么场景中使用?

  • 代码复用: 当多个构造函数需要执行相同的初始化步骤时,可以使用委托构造函数来避免代码重复。

#include <iostream>
#include <string>class Person {
public:Person() : Person("Unknown", 0) {std::cout << "Default constructor called\n";}Person(std::string name) : Person(name, 0) {std::cout << "Name constructor called\n";}Person(std::string name, int age) : name(name), age(age) {std::cout << "Full constructor called for " << name << std::endl;}private:std::string name;int age;
};int main() {Person p1;Person p2("Alice");Person p3("Bob", 30);return 0;
}
  • 链式委托: 一个构造函数可以委托给另一个构造函数,而后者又可以委托给下一个,形成一个委托链。

class Matrix {
public:Matrix() : Matrix(0, nullptr) {std::cout << "Default constructor called\n";}Matrix(size_t rows, size_t cols) : Matrix(rows, cols, new double*[rows]) {std::cout << "Size constructor called\n";}Matrix(size_t rows, size_t cols, double** data) : rows(rows), cols(cols), data(data) {std::cout << "Data constructor called\n";}private:size_t rows;size_t cols;double** data;
};int main() {Matrix mat;return 0;
}
  • 继承和覆盖: 在继承的类中,可以利用委托构造函数调用基类的构造函数,以确保正确的初始化。

class Base {
public:Base(int x) {std::cout << "Base constructor with int called\n";}
};class Derived : public Base {
public:// 委托给基类的构造函数Derived(double x) : Base(static_cast<int>(x)) {std::cout << "Derived constructor with double called\n";}
};int main() {Derived d(3.14);return 0;
}

3. 注意事项:

  • 委托目标的选择: 确保委托的目标构造函数是有效的,并且能够正确初始化对象。

#include <iostream>
#include <string>
#include <vector>class Data {
public:// 正确的委托目标选择Data(const std::string& str) : Data(str.begin(), str.end()) {}// 正确的初始化列表Data(const char* begin, const char* end) {// 做一些初始化工作for (; begin != end; ++begin) {values.push_back(*begin);}std::cout << "Data initialized with " << values.size() << " elements." << std::endl;}private:std::vector<char> values;
};int main() {Data d("Hello");return 0;
}
  • 构造函数的递归调用: 避免构造函数之间的无限递归调用。

class RecursiveConstructor {
public:// 错误:递归调用自身RecursiveConstructor() : RecursiveConstructor(42) {}RecursiveConstructor(int) {std::cout << "Constructor called" << std::endl;}
};int main() {// RecursiveConstructor rc; // 这将导致无限递归调用return 0;
}
  • 资源管理: 在委托构造函数中,确保资源被正确管理和释放。

#include <iostream>class Resource {
public:// 委托构造函数正确地管理资源Resource(int id) : Resource(id, new int(id * 10)) {std::cout << "Resource ID: " << *data << std::endl;}// 被委托的构造函数Resource(int id, int* data) : id(id), data(data) {}~Resource() {delete data;}private:int id;int* data;
};int main() {Resource res(1);return 0;
}//在这个例子中,委托构造函数确保了资源(动态分配的整数)被正确地分配和初始化。
  • 异常安全: 委托构造函数需要考虑异常安全性,确保在抛出异常时对象处于一致的状态。

#include <iostream>
#include <string>class ExceptionSafe {
public:// 委托构造函数ExceptionSafe(const std::string& str) : ExceptionSafe(str.begin(), str.end()) {// 做一些可能会抛出异常的操作if (str.empty()) {throw std::invalid_argument("String is empty");}}// 被委托的构造函数ExceptionSafe(const char* begin, const char* end) {// 做一些初始化工作try {for (; begin != end; ++begin) {values.push_back(*begin);}} catch (...) {// 异常发生时进行清理工作std::cout << "Exception caught during initialization." << std::endl;throw;}std::cout << "Data initialized with " << values.size() << " elements." << std::endl;}private:std::vector<char> values;
};int main() {try {ExceptionSafe es("Hello");ExceptionSafe esEmpty("");} catch (const std::exception& e) {std::cout << "Caught exception: " << e.what() << std::endl;}return 0;
}


http://www.mrgr.cn/news/41712.html

相关文章:

  • 开放式耳机哪个品牌好?分享几款不错的开放式蓝牙耳机
  • C++常引用详解
  • Java开发类加载器实现机制
  • Visual Studio 使用技巧之界面布局
  • 浏览器 F12 application 应用程序面板
  • 10. 模块
  • 大学城就餐推荐系统小程序的设计
  • 深入理解 Git 一个开发者的必备工具
  • 【2023工业3D异常检测文献】Shape-Guided: 基于形状引导和双记忆库的异常检测方法
  • 使用rust写一个Web服务器——async-std版本
  • vue3 + ts + cesium:绘制自由曲线(polyline)
  • 性能测试的方式有哪些
  • C++ 双端队列(deque)的深入理解
  • 【SpringBoot】
  • LabVIEW混合控制器质量检测
  • 智慧校园建设方案
  • 黑科技!AI消除工具让照片大变身
  • 解决银河麒麟终端快捷键问题:“Ctrl+Alt+T”无法打开终端
  • 遥感影像-语义分割数据集:Landsat8云数据集详细介绍及训练样本处理流程
  • Python酷库之旅-第三方库Pandas(132)