effective morden c++ 2

条款七 

区分()与 {} 

3中初始化方式

int x(0)

int x = 0

int x{0} //相当于int x = {0}

int x //没有初始化

在类内成员初始化时等号与大括号均可,但是小括号不行

对于不可复制的对象则不可用"="

对于大括号而言{}不允许进行隐式的窄化内建型转换(高精度 -> 低精度,因为低精度存储不了高精度){int, double}若要double转换成int,那就通不过编译

{} 另一种特性,可以消除调用默认构造函数确被判断成函数声明的情况

int i(); //函数声明

int i{} //默认初始化

 

{}特殊处:

使用{}初始化会优先采用以initializer_list<T>的构造函数,且若能使用initializer_list<T>就不会把其他类型的构造函数加入到候选名单中{ int, double}将优先选择initializer_list<T>为参数的构造函数比如 construct(initializer_list<int> li)但是由于double需要窄化转换,故无法使用这个构造函数,即使同时也有一个construct(int, double)版本的构造函数,这个构造函数也不会加入候选名单。

故除非无法匹配initializer_list<T>中的任何一个,比如使用{string, string}来调用构造函数,string无法转化成int故不会选择initializer_list<T>版本。

最后一个特例出现在空的{}时,此时会默认选用一般的默认构造函数,如果要使用空的initializer_list<T>调用initializer_list<T>版本构造则需要{{ }}两个大括号或({})一个小括号里有一个大括号

 

 

 

 

条款八

优先使用nullptr而非0或是NULL

0或是NULL本质的类型为int和某种整型,故进行函数的调用时0与NULL会会被推断成实际的整型,nullptr则是指针型

所以也正是因此,要避免整型和指针类型的重载(因为有人会用0或者NULL)

 

 

 

 

条款九

优先使用using声明

using声明允许模板化

template<typename T>

using type = vector<T>;

type<int>  ==> vector<int>

等价的typedef则需要借助一个struct

template<typename T>

struct s{

    typedef type vector<T>;

};//而且使用起来名字也长了不少

 

 

 

 

 

条款十

优先选择使用限定了作用域的enum

enum class et1{....}           ----->              限定了作用域

enum et2{..}                      ------>             未限定作用域的

未限定作用域的et2内部的变量名字和et2处在同一个作用域,而et1则是像一个类一样包含其内部变量的。限定作用域还阻止了枚举型到相应的数值类型的隐式自动转换,需要借助static_cast才能将这些名字转换成相应数值类型。另一点则是enum class可以进行前置声明如:

                  enum calss et1;

而未限定作用域则需要指定类型后才可,如:

                  enum et2 : int;

有一种特殊情况下不限定作用域会更加方便,即使用tuple时:

tuple<t1,t2,t3...>  tu;

auto t = get<i>(tu);//取出tu中的第i个成员引用即ti类型的引用

此时使用不限定作用域的enum可以直接代替i来使用,而限定作用域的enum class则需要static_cast转换成size_t类型再操作。

当然,可以写一个返回constexpr类型的函数来解决这个问题。

template<typename T>

typename auto  toUtype(T enumerator)

{

          return static_cast<typename std::underlying_type_t<T>>(enumerator);

}//其实是返回enum class成员的原本数值类型

 

 

 

 

 

 

条款十一

优先使用delete而非private未定义函数

delete函数在写下代码时就可以检测出错误,private未定义函数则需要等到链接才行。

另外delete可以用于一般函数(用来作用于重载函数可以排除不接受的参数类型)甚至可以作用于模板函数的特化版本

(要注意模板特化不可以出现在类内)

 

 

 

 

 

 

条款十二

为改写函数加上override

可以防止你在派生类中的同名函数有任何声明形式上的不同

如:

参数

const修饰

引用修饰

返回值

异常规格

基类对应成员函数为virtual

 

另外这两个关键字可以做作为函数名字使用,因为override和final是只有在声明末尾的时候才会被解释成关键字

如   void fun() final   ->   关键字

       void final()         ->   名为final的函数

 

此外

由左引用&修饰的函数如:void fun() &,应当返回左值;而右引用&&则应当返回右值。

因为右值引用修饰的函数只会被右值类实例调用,故调用函数的类实例的内部成员应当会在调用结束后被释放(因为这个类实例会被释放),所以不能返回左值(因为他们会被释放,你不能返回一个被释放成员的引用)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《现代控制系统》第13版解答是一本帮助学习者掌握现代控制系统基础知识和技能的重要参考书。本书主要介绍了控制系统的基本概念、模型和各种控制方法,视觉系统和数字信号处理。本书重点介绍了基于状态空间的设计方法和反馈控制理论,以及自适应控制、模糊逻辑控制和神经网络控制等现代控制技术。 全书主要包括了控制系统分析基础、传递函数模型、状态空间模型、自动调节器设计、采样控制系统、稳定性分析和设计、频率分析与设计、根轨迹设计方法、神经网络控制、模糊控制、数字控制和非线性控制等内容。 《现代控制系统》第13版解答还包括大量的习题和例题,以帮助学习者加深对各种控制方法的理解和掌握,同时通过习题和例题也能够检验学习成果,提高自己的解决问题的能力。总之,这本书是学习现代控制系统的必备读物,对于感兴趣的读者来说是一本非常重要的参考书。 ### 回答2: 现代控制系统第13版解决方案是一个包含每章问题解答的资源。此书是用于控制理论和实践的优秀教材,但是在学习过程中,同学们可能会发现一些问题难以理解或解决,因此解决方案提供了对应的解答,帮助同学们更好地理解和掌握控制系统的知识。 该解决方案不仅提供了每章末尾的问题解答,也提供了一些实用的辅助资源,如MATLAB代码、实验指导、作业指导和简短的概述,这些资料可以帮助同学们更好地掌握控制理论,并更好地应用到实践中。 此外,该解决方案还提供了一些挑战性问题,供那些想要将自己的知识进一步拓展的同学们挑战。通过解决这些问题,同学们可以更深入地了解控制系统的原理和应用,以及如何将控制理论运用到实际工程问题中。 总之,现代控制系统第13版解决方案是一个非常有价值的资源,它可以帮助学生更好地理解和掌握控制系统的知识和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值