读c++primer

static类成员

  1. static数据成员的类型可以是该成员所属类类型,但是非static成员的类型只能是该成员所属类类型的指针或引用。原因:static成员不属于任何对象,在构建对象时不需要计算static变量大小,可以构建成功。构建对象时需要计算非static成员的大小,但显然无法计算(每个类对象都包含类对象,递归了)。
class Bar{
private:
	static Bar mem;//ok
	Bar* men1;//ok
	Bar& mem2;//ok
	Bar mem3;//error
}

explicit

  1. explicit被用来禁止隐式转换,下面是隐式转换的例子。
class String {
 public:
  String(size_t size) {
    std::cout <<"parameter is size"<< std::endl;
    size_ = size;
    pstr_ = (char*)malloc(size + 1);
    memset(pstr_, 0, size + 1);
  }
  String(const char* pstr) {
    std::cout <<"parameter is pstr"<< std::endl;
    pstr_ = (char*)malloc(strlen(pstr) + 1);
    strcpy(pstr_, pstr);
    size_ = (size_t)strlen(pstr);
  }
 private:
  size_t size_;
  char* pstr_;
};
int main() {
  // 预期成功的初始化
  String string1(24);  // 这样是OK的, 为CxString预分配24字节的大小的内存
  std::cout << "---------------"<<std::endl;
  String string4("aaaa");  // 这样是OK的
  std::cout << "---------------"<<std::endl;
  
  // 非预期成功的初始化
  String string2 = 10;  // 这样是OK的, 为CxString预分配10字节的大小的内存
  std::cout << "---------------"<<std::endl;
  String string5 = "bbb";  // 这样也是OK的, 调用的是CxString(const char *p)
  std::cout << "---------------"<<std::endl;
  String string6 = 'c';  // 这样也是OK的, 其实调用的是CxString(int size),
                         // 且size等于'c'的ascii码
  std::cout << "---------------"<<std::endl;
  string1 = 2;  // 这样也是OK的, 为CxString预分配2字节的大小的内存
  std::cout << "---------------"<<std::endl;
  string2 = 3;  // 这样也是OK的, 为CxString预分配3字节的大小的内存
  std::cout << "---------------"<<std::endl;
}
  1. 为什么会与有这么多非预期的构造函数成功呢?

在c++中,如果是单参构造函数,在编译时就会有一个隐式的转换过程,将构造函数参数类型的数据转换为该类对象。也就是说,String string2 = 10;在这句代码中,编译器自动调用参数类型为size_t的构造函数将参数10转化为类对象。

  1. 使用explicit来避免编译器的隐式构造,只需要在构造函数前面加上explicit即可。

构造函数

  1. 默认构造函数。

只要定义一个对象没有提供初始化,如:String string;,就会使用默认构造函数。为所有形参提供默认实参的构造函数也是定义默认构造函数,如:String string(std::string str=" ")

  1. 合成默认构造函数

1.该函数使用与变量初始化相同的规则来初始化成员,类类型的成员运用各自的默认构造函数进行初始化。
2.只有当类对象定义在全局作用域内,类内的内置类型和复合类型变量才会被初始化为0,当类对象定义在局部作用内不会被初始化,所以有内置和复合类型成员的类,应该自己定义构造函数来初始化这些成员。内置类型:int, bool, double 复合类型:指针, 数组, 字符串, 结构体等,基于其他类型定义的类型。
3.只有当一个类没有定义构造函数时,编译器才会根据需要去判断是否自动生成默认构造函数,这里的关系是必要非充分。

c++代码中局部的内置类型变量都是不会默认清零的,全局变量可以。理由是,局部变量在栈中,若在栈中增加清零操作会使函数调用等操作变慢,

编译器合成默认构造函数的条件

  1. 需要调用对象类成员或基类的默认构造函数
  2. 对对象初始化虚表指针或虚基类指针

析构函数

  • 在堆上创建的对象,需要手动删除,否则不会调用析构函数,导致内存泄漏,对象内部的任何资源也不会被释放。

实践

  • 类中有虚函数,链接时发现类名未定义,需要给虚函数后面=0。
内容概要:本文档详细介绍了如何在MATLAB环境下实现CNN-GRU(卷积门控循环单元)混合模型的多输入单输出回归预测。项目旨在通过融合CNN的局部特征提取能力和GRU的时序依赖捕捉能力,解决传统序列模型在处理非线性、高维、多输入特征数据时的局限性。文档涵盖了项目背景、目标、挑战及其解决方案,强调了模型的轻量化、高效性和可视化全流程追踪等特点。此外,还提供了具体的应用领域,如智能电网负荷预测、金融时间序列建模等,并附有详细的代码示例,包括数据加载与预处理、网络结构定义、训练选项设置、模型训练与预测以及结果可视化等步骤。; 适合人群:对深度学习有一定了解,特别是对时间序列预测感兴趣的科研人员或工程师。; 使用场景及目标:①需要处理多输入单输出的非线性回归预测任务;②希望在MATLAB平台上快速实现并优化深度学习模型;③寻求一种高效、轻量且具有良好泛化能力的预测模型应用于实际场景中,如智能电网、金融分析、交通流量预测等领域。; 阅建议:由于文档内容涉及较多的技术细节和代码实现,建议者先熟悉CNN和GRU的基本概念,同时掌握MATLAB的基础操作。在阅过程中,可以结合提供的代码示例进行实践操作,以便更好地理解和掌握CNN-GRU混合模型的构建与应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值