C++构造函数的初始化列表

1.有三种情况下是一定要用初始化列表的,单类的数据成员里面有const成员,或者有数据成员是引用,或者有没有默认构造函数的类成员。const和引用成员可以被初始化,但不可以被赋值。而如果一个类成员没有用初始化列表初始化的时候,编译器在进入构造函数的第一条语句前会先调用类成员的默认构造函数。而如果该类数据成员没有默认构造函数的时候,就会出项错误。这三种情况下是一定要用初始化列表的。
    2.在构造函数初始化列表里面没有显式提及的类数据成员按如下规则初时化:如果是内置类型则根据该对
象的位置而定,如果对象是全局,那么内置类型被初始化为零,如果不是全局,那么内置类型未知。如果是类类型则调用该类的默认构造函数。所以如果那个类没有默认构造函数,而又不在初始化列表中显式提及,就会出错!

    在前面的例程中,我们对成员数据的初始化,都是在函数体中进行的,但有些情况下这种初始化的方法是行不通的,例如:
#include <iostream>
using namespace std;

class Date{
 int da, mo;
 const int yr;//const常量
public:
 Date(int d, int m, int y)  //有参数的构造函数 
    
  cout << "Have parameter: "; 
  da = d;
  mo = m;
  yr = y; //此处有错误
 }
 void display()
 {
  cout << "\n" << mo << "-" << da << "-" << yr;
 }
};

int main()            
{
 Date a(17,4,2007);  
 
 a.display();
 
 getchar();
 return 0;
}
在类Data中有一个成员yr是一个const int类型,它是不能在函数体中被重新赋值的。这种情况下我们只有
使用另一种特殊的初始化方式——初始化列表。初始化列表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。

   构造函数初始化列表的使用规则:
   如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。

 class A {

 
  A(int x);  // A的构造函数
 };
 class B : public A{

  …
  B(int x, int y);// B的构造函数
 };
 B::B(int x, int y): A(x){    // 在初始化表里调用A的构造函数 
   …
 
    类的const常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化。类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。

    非内部数据类型的成员对象应当采用第一种方式初始化,以获取更高的效率。
class A{

  …
 A(void);    // 无参数构造函数
 A(const A &other);  // 拷贝构造函数
 A & operate =( const A &other); // 赋值函数
};
class B{
   public:
   B(const A &a); // B的构造函数
   private:
   A  m_a;   // 成员对象
 };
 示例(a)中,类B的构造函数在其初始化表里调用了类A的拷贝构造函数,从而将成员对象m_a初始化。
 示例(b)中,类B的构造函数在函数体内用赋值的方式将成员对象m_a初始化。我们看到的只是一条赋值语句,但实际上B的构造函数干了两件事:先暗地里创建m_a对象(调用了A的无参数构造函数),再调用类A的赋值函数,将参数a赋给m_a。

B::B(const A &a): m_a(a){ //示例(a) 成员对象在初始化表中被初始化
   …
}

B::B(const A &a){   //示例(b) 成员对象在函数体内被初始化
m_a = a;


   
 对于内部数据类型的数据成员而言,两种初始化方式的效率几乎没有区别,但后者的程序版式似乎更清晰些。若类F的声明如下:
 class F{
  public:
  F(int x, int y);  // 构造函数
   private:
  int m_x, m_y;
  int m_i, m_j;
 }
 示例(c)中F的构造函数采用了第一种初始化方式,示例(d)中F的构造函数采用了第二种初始化方式。
F::F(int x, int y): m_x(x), m_y(y){ //示例(c)数据成员在初始化表中被初始化
   m_i = 0;
   m_j = 0;
}
F::F(int x, int y){ //示例(d)数据成员在函数体内被初始化
   m_x = x;
   m_y = y;
   m_i = 0;
   m_j = 0;
 (引自<<高质量c++编程指南>>)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在风能领域,准确预测风速对于风电场的运行与管理至关重要。Matlab作为一个强大的数学计算和数据分析平台,被广泛应用于风速预测模型的构建。本文将深入探讨基于四种风速——随机风、基本风、阵风和渐变风的组合风速预测技术。 我们来理解这四种风速类型: 1. **随机风**:随机风是指风速呈现出随机性的变化,通常由大气湍流引起。在建模中,通常通过统计方法如高斯分布或Weibull分布来模拟这种不确定性。 2. **基本风**:基本风速是指在无特定扰动条件下的平均风速,它是长期观测结果的平均值,通常用于结构设计和风能评估。 3. **阵风**:阵风是短时间内风速显著增强的现象,对建筑物和风力发电机造成的主要威胁之一。阵风的预测涉及到风的脉动特性分析。 4. **渐变风**:渐变风是指风速随时间和空间逐渐变化的过程,常见于风向转变或地形影响下的风场变化。 在Matlab中,利用这四种风速类型进行组合预测,可以提高预测的准确性。预测模型可能包括以下几个步骤: 1. **数据收集与预处理**:收集历史风速数据,包括随机风、基本风、阵风和渐变风的数据,进行异常值检测、缺失值填充以及数据标准化。 2. **特征工程**:提取风速变化的相关特征,如平均值、标准差、极值、频率分布等,这些特征可能对预测有重要影响。 3. **模型选择**:可以选择多种预测模型,如时间序列分析(ARIMA、状态空间模型等)、机器学习算法(线性回归、决策树、支持向量机、神经网络等)或深度学习模型(LSTM、GRU等)。 4. **模型训练**:利用历史数据训练选定的模型,调整模型参数以优化性能,例如通过交叉验证来避免过拟合。 5. **模型验证与评估**:使用独立的测试集验证模型预测效果,常见的评估指标有均方误差(MSE)、平均绝对误差(MAE)和决定系数(R²)。 6. **组合预测**:结合四种风速的不同模型预测结果,可以采用加权平均、集成学习(如bagging、boosting)等方式,以提升整体预测精度。 7. **实时更新与动态调整**:实际应用中,模型需要不断接收新的风速数据并进行在线更新,以适应风场环境的变化。 通过以上步骤,可以构建一个综合考虑各种风速特性的预测系统,这对于风电场的功率输出预测、风电设备的维护计划以及电网调度都具有重要价值。然而,需要注意的是,每个风场的地理环境、气候条件和设备状况都有所不同,因此模型的建立应根据实际情况进行定制和优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值