Effective C++笔记(1)

本文探讨了C++编程中的关键概念,包括构造函数、复制构造函数、赋值操作符的区别及使用场景,以及如何通过const提升代码质量和效率。还介绍了语言联邦的概念,并提供了提高C++代码质量的具体建议。

Effective C++笔记
第一章 00~04

p0:导读

1:构造函数声明为explict,可以禁止编译器执行非预期的类型转换(阻止隐式转换,但可以显式转换)。
2:copy构造函数 用来”以同类型对象初始化自我对象”
copy赋值操作符 用来”从另一个同类型对象拷贝其值到自我对象”。
两者区别在于如果一个新对象是被定义,一定会调用一个构造函数,不可能是赋值操作,
如果没有新对象被定义,那就是赋值操作被调用。

    Widget w1; 
    Widget w2(w1); //copy构造函数
    Widget w3 = w2;//copy构造函数
    w1 = w2;   //copy assignment操作符

p1:视C++为一个语言联邦

四个模块:C, object-oriented C++, template C++, STL
高效:内置类型传递使用值传递,自定义类型使用引用传递。

p2:尽量用 const ,enum , inline 替换 #define

1:定义常量指针 const char* const authorName = “Sping”;
const std::string authorName(“Sping”);

2:class 专属常量

    //.h
    class GamePlayer
    {
        private:
            static const int NumTurns = 5;  //1:常量声明
            static const int NumTurn;       //2:常量声明
            int scores[NumTurns];
    };
    //.cpp
    const int GamePlayer::NumTurns;   //1:常量定义  //对于class专属常量,如果是整数类型并且不需要取地址的话可以不定义。
    const int GamePlayer::NumTurn = 5;//2:常量定义

3:一个属于枚举类型的数值可权充ints使用, 比如常见的对话框资源ID。

    class Game
    {
        private:
            enum { NumTurns = 5 };
            int scores[NumTurns];
    };

4:使用 template 替换宏定义

    //如以a和b的较大值调用f函数
     #define CALL_WITH_MAX(a,b) f( (a)>(b) ? (a):(b) ) 
    template <typename T>
    inline void callWithMax(const T& a, const T& b)
    {
        f(a > b ? a : b);
    }

p3:尽可能使用const

1:指针指向常量 与 常量的指针
const在左边,表示被指物是常量;const在右边,表示指针自身是常量;

    char greeting[] = "Hello";
    const char* p = greeting; //no-const *p, const data
    char* const p = greeting; //const *p, no-const data

2:声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
3:成员函数如果只是常量性不同,可以被重载
4:mutable(可变的),关键字mutable释放掉non-static成员变量的bitwise constness约束。
5:当const和 non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

    class TextBlock
    {
        public:
            const char& operator[](std::size_t position) const{
                return text[position];
            }
            char& operator[](std::size_t positon){
                return const_cast<char&>( 
                    static_cast<const TextBlock&>(*this)[position] 
                    ) //1:为*this加上const调用const op[];
            }         //2:将op[]返回值的const转除;
        private:
            std::string text;

        public:
            std::size_t length() const;
        private:
            char* pText;
            mutable std::size_t textLength; //最近一次计算的文本长度
            mutable bool lengthIsValid; //目前长度是否有效

    };
    std::size_t TextBlock::length() const
    {
        if(!lengthIsValid){
            textLength = std::strlen(pText);    
            lengthIsValid = true;
        }
    }

p4:确定对象呗使用前已先被初始化

1:C++不保证初始化内置类型的对象。
2:对象的成员变量的初始化发生在进入构造函数之前。
3:构造函数最好使用成员初值列,而不要在构造函数中使用赋值操作,初值列的初始化次序只与class中的声明次序一致。
4:为免除”跨编译单元之初始化次序”问题,应以local static对象替换non-local static对象。

    FileSystem& tfs()
    {
        static FileSystem fs;  //函数内的static对象称为local static。
        return fs;
    } //也即是设计模式中的单例模式
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值