C++入门(7):对象

C++入门(7):对象

类 = 属性 + 方法;
类名的第一个字母一般采用大写,类声明的末尾必须加上分号“;”;C++允许在类里声明常量,但不允许对它赋值,除非创建一个静态常量。

构造器
1)构造器的名字和它所在类的名字一样;
2)系统会在创建出某个新实例之后,立刻自动调用这个类的构造器;
3)构造器永远不返回任何值。
如果没有在类里定义一个构造器,编译器会自动创建一个,形式为:ClassName::ClassName(){},还会创建一个副本构造器。
构造器经常需要重载,即同一个类可以有多个构造器定义,它们名字一样,只是在输入参数的个数和类型上有差异。

析构器
在销毁一个对象时,系统会自动调用类的另一个特殊方法:析构器;
析构函数名也是类名,只是函数名前多了一个波浪符(~);
析构器永远不返回任何值且不带输入参数,声明只有一种形式:~ClassName()。

this 指针
在类里, this 指针代表当前对象,其基本用途是避免二义性(尤其在引用变量和属性的时候)。

下面通过举例及讲解来认识C++中对象的相关知识:

#include <iostream>

class Student{
    public:
        static const bool flag = true ;    //静态常量,这样是可以的!
        char sex;
        std::string yourName;

        Student(char s);                   //构造函数,输入参数有默认值时为默认构造器,参数可选,一般来说,每个类至少应该有一个默认构造器
        ~Student();                        //析构函数

        void print(std::string name);      //给类添加方法:1)先在类的声明里创建一个方法的原型;2)方法的定义(实现)通常在类声明的后面 。
        void inputName() ;
};

//如果在类声明里声明和定义函数,其效果等同于在请求编译器把每个函数当做一个内联函数来对待。

Student::Student(char s)                    //如果构造器声明改为:student(char sex);则为避免二义性,构造器定义中的赋值应改为:this.sex = sex;
{
    std::cout << "I am a Constructor." << std::endl;
    sex = s;
}

Student::~Student()
{
    std::cout << "I am a Destructor." << std::endl;
}

void Student::print(std::string name)       //定义类的方法的函数体时,必须指明该方法属于哪个类 :ClassName::functionName
{
    std::cout << "Nice to meet you, " << name << std::endl;
    std::cout << "You are " << sex << std::endl;
}
void Student::inputName()
{
    std::cout << "Honey, what's your name? " << std::endl;
    if(flag)
    {
        std::cin >> yourName;
        if(std::cin.good())
        {
            print(yourName);                //类中方法可以相互调用
        }
        else
        {
            std::cout << "See you next time." << std::endl;
        }
    }
}

int main(int argc, char** argv) {

    Student student1('F');                  //创建类的实例,即对象;由于它的构造函数有参数,所以实例化时需要传入参数
    student1.inputName();                   //调用类的方法

    Student student2 = student1;            //把一个对象赋值给另一个同类的对象将使同名的属性有同样的值
    std::cout << "student2's sex is " << student2.sex << std::endl;   //程序结束之后,需要调用两次析构器

    return 0;
}

运行结果为:

I am a Constructor.
Honey, what's your name?
xiuxiu
Nice to meet you, xiuxiu
You are F
student2's sex is F
I am a Destructor.
I am a Destructor.

C++入门(6):复杂的数据类型

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值