More Effective C++ 35个改善编程与设计的有效方法笔记与心得 1

一. 基础议题

条款1:仔细区别 pointers 和 references

‌‌‌‌  这是一个常见的问题。指针(pointers)和引用(references)都是C++面向对象编程中常用的概念,虽然他们在某些方面表现得很相似,但是其实他们有一些重要的区别。

1. 初始化

  • 指针可以在任何时候被初始化,而且可以多次重新赋值,指向不同的对象或值。
  • 引用在创建时必须被初始化,并且一旦被初始化后就不能改变目标对象。换句话说,引用一旦绑定到一个对象上,就不能重新赋值引用到另一个对象。

2. Null值

  • 指针可以为null,表示它没有指向任何对象。
  • 引用不能为null,必须始终链接到一个已经存在的对象。

3. “解引用"与"间接访问”

  • 指针需要被"解引用"以访问其指向的值(使用*操作符)。
  • 引用不需要特别的语法就可以访问其关联的对象,可以像访问普通变量一样操作引用。

4. 内存

  • 指针本身也有一个内存地址,并占据内存空间。
  • 引用不占用实际内存,只是一个别名。

5. 指针的指针与引用的引用

  • 可以有指向指针的指针,甚至有指向指针的指针的指针等等。
  • C++规定,没有引用的引用

‌‌‌‌  总的来说,如果需要一个变量与另一个变量共享/链接同一值,并且不需要修改链接的话,引用通常是更好的选择。相反,如果你需要存储空值NULL,或者需要在不同的时间点指向不同的对象或者更改指向,则需要使用指针。

条款2:最好使用C++转型操作符

C++提供了四种类型转换操作符:static_castdynamic_castconst_castreinterpret_cast。各自都有特定的用途,你应该根据具体的情况选择使用哪一种。

  1. static_cast:这是最常用的转型操作符,可以用于各种简单的、非多态类型之间的转换,比如基础数据类型(如int到float,float到int),同一继承层级中的上下转型等。

  2. dynamic_cast:主要用于类层次间的向上和向下转换。只有当所涉及的类都是多态的(即,至少有一个虚函数)时才可以使用。如果转换失败,dynamic_cast会返回null。

  3. const_cast:用于将const对象转为非const对象,或者将volatile对象转为非volatile对象。但这并不意味可以通过const_cast修改const对象的值,因为那通常會是未定义的行为。

  4. reinterpret_cast:进行低层次的类型转换,比如将一个指针转换为一个整数,或者将一个类型的指针转换为另一个不相关类型的指针。应谨慎使用,因为其结果很可能取决于具体实现,而且在不同的机器和编译器上可能会有不同的结果。

以上就是C++中的四种转型操作符。值得注意的是,应该优先使用C++的这四种类型转换操作符,而不是C风格的类型转换,因为C++的类型转换操作符更易于找到,也更易于理解和控制。

这里再解释一下volatile对象:
‌‌‌‌  volatile是C++中的一个关键字,它用来修饰变量,表示这个变量可能会在外部,而非程序代码本身,被意外改变。对于被volatile关键字修饰的变量,编译器将会做两件事:

  1. 它将确保不会因为编译器的优化策略而调整对这个变量的读取和写入的顺序。也就是说,编译器不会将这些操作进行缓存或者重排,而是每次都会直接在内存中进行。

  2. 它通知编译器对这个变量的操作不可省略。也就是说,即使同一个值被写入多次,或者读取后的值没有被使用,编译器都不可以省略这些 seemingly redundant的操作。

常见的场合如下:

  • 并发编程:当多个线程可能会访问和修改同一个数据项时,这个数据项应该被声明为volatile。

  • 硬件访问:当一个变量可能被外部之外的事物修改,比如:硬件寄存器,应该将该变量声明为volatile。

  • 用于实现特殊的内存映射,例如某些特殊的硬件设备的内存区域。

请注意,尽管volatile可以防止编译器的某些优化,但它并不是线程安全的解决方案。在多线程环境中进行操作时,需要额外的同步工具(如互斥锁,信号等)来保证线程安全。

条款3:绝对不要以多态(polymorphically)方式处理数组

‌‌‌‌  这句话其实是建议我们在使用含有多态性质的数组(即,数组元素是基类的指针,但实际指向不同的子类对象)时需要格外小心。

‌‌‌‌  当我们处理传统的数组时,编译器会做很多工作来帮助我们,例如正确地识别并管理数组中元素的大小和布局。但是当我们使用多态数组时,这些编译器的帮助就不再适用,我们需要手动管理元素的生命周期,包括它们的创建和销毁。

‌‌‌‌  如果我们像处理普通数组一样处理多态数组,而没有正确管理这些对象的生命周期,就可能会导致一些问题,如内存泄漏或者对象的“切片”

‌‌‌‌  对象的“切片” 是一个常见的问题,发生在当我们直接把一个子类对象赋值给一个基类对象时。子类对象的“基类部分”会被复制到基类对象中,而子类特有的部分则会被切掉,造成数据丢失。

例如以下代码:

Base array[10];
Derived d;

array[0] = d; // 对象切片, 把派生类对象赋值给基类对象, 丢失了派生类特有的数据。

‌‌‌‌  解决上述问题的常见策略是使用容器类(如vectorarray)存储指向基类的指针,并使用new创建对象,delete删除对象,从而确保每个对象都正确地创建和销毁。

std::vector<Base*> array;
array.push_back(new Derived());
...
delete array[0]; // 不能忘记删除对象以防止内存泄漏

‌‌‌‌  所以,"绝对不要以多态方式处理数组"的主要含义是,我们在使用多态数组时必须要更加小心,以防止上述的问题发生。

条款4:非必要不提供default constructor

‌‌‌‌  这句话的含义是,除非特别需要,否则应避免提供默认构造函数

‌‌‌‌  在C++中,默认构造函数是一个没有任何参数的构造函数,或者,所有参数都有默认值的构造函数。其他语言中同样也有类似的概念。

‌‌‌‌  默认构造函数被调用的情况包括如下几种:创建新对象时没有提供任何参数创建类的数组时类的派生类的构造函数中调用基类的构造函数,但没有提供任何参数。

‌‌‌‌  通常,如果给定的类有一些必须要满足的初始条件或者属性,那么为了避免默认构造函数创建出未初始化或者部分初始化的对象,我们可能会选择不提供默认构造函数。

‌‌‌‌  比如说:假设我们有一个表示分数的类Fraction。每个Fraction对象都有两个成员变量,分子(numerator)和分母(denominator)。在这个情况下,我们可能不希望 提供一个默认构造函数 Fraction(),因为这样可能会创建出一个分母为0的对象,这在数学上是没有意义的,因此我们更希望用户必须手动提供分子和分母。

‌‌‌‌  所以,"非必要不提供default constructor"主要是为了防止创建未初始化或部分初始化的对象,提高代码的健壮性。但是,具体是否需要提供默认构造函数,还需要根据类对象的具体需求来决定。

  • 33
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《更有效的C语言编程设计35有效方法》是一本非常实用的书籍,它总结了35个提高C语言编程设计能力的有效方法。这本书结合实际编程经验,从不同角度介绍了如何更高效地利用C语言进行软件开发。 该书首先从代码的可读性和可维护性方面提出了一些方法。比如,合理命名变量和函数、遵循一定的代码风格、使用注释等,这些方法可以使代码更易于理解和修改,提高工作效率。 其次,该书讲解了一些关于内存管理和指针的技巧。对于C语言的开发者来说,内存管理是一个非常重要的技能。书中通过介绍如何正确使用动态内存分配函数、如何避免内存泄漏等方面来帮助读者提高内存管理的能力。 此外,该书还提供了一些提高代码质量和性能的方法。如代码复用、性能优化等。对于C语言开发者来说,写出高质量、高效率的代码是非常重要的,这本书可以帮助读者掌握一些技巧和原则。 总的来说,这本书内容丰富,通俗易懂,适合C语言的初学者和有一定基础的开发者阅读。它可以帮助读者全面提高C语言编程设计的能力,提升工作效率。无论是想从事C语言开发还是提升编程技能的人,都可以从中受益匪浅。 ### 回答2: 《more effective c: 35改善编程设计有效方法(中文版) 》是一本非常实用的书籍,它提供了许多改善编程设计有效方法。以下是对该书的回答: 这本书共包含了35方法,旨在帮助读者提高编程设计的效率。它首先介绍了良好的编程风格和规范,包括命名规则、代码布局、注释等。这些方法可以使代码更易于阅读和维护,并提高代码的可重用性和可扩展性。 接下来,该书介绍了一些常见的编程错误和陷阱,并提供了相应的解决方案。例如,它说明了内存管理的重要性,并给出了避免内存泄漏和悬挂指针的方法。 此外,该书还介绍了一些高级的编程技术和设计模式,如多线程编程、异常处理和继承等。这些方法可以帮助读者编写更健壮和可靠的程序,并提高程序的性能和响应能力。 另外,该书还强调了测试和调试的重要性,并介绍了一些常用的测试工具和技术。它提供了一些测试和调试的实用方法,帮助读者发现和修复程序中的错误和缺陷。 总的来说,《more effective c: 35改善编程设计有效方法(中文版) 》是一本非常实用的书籍,它提供了许多实用的方法和技巧,帮助读者提高编程设计的效率。无论是初学者还是有经验的开发者,都可以从中受益,并提升自己的编程能力。 ### 回答3: 《more effective c :35改善编程设计有效方法(中文版) .pdf》是一本关于优化编程设计有效方法的书籍。 这本书共包含了35有效方法,可以帮助程序员和设计师改进他们的工作。在这本书中,作者提供了一些实用的技巧和经验,帮助读者提高他们的编程设计技能。 这本书的价值在于它提供了实用的方法和步骤,读者可以按照这些方法和步骤进行实施,从而实现更有效编程设计。这本书涵盖了多个方面,包括代码的优化、错误的处理、算法的选择、设计模式的应用等等。 通过阅读这本书,读者可以了解到如何更好地组织和管理代码,以及如何选择合适的算法和数据结构来提高程序的效率。此外,这本书还介绍了一些设计模式和原则,读者可以学习如何使用它们来提高程序的灵活性和可维护性。 总之,这本书提供了一些实用的方法和技巧,帮助读者改进他们的编程设计技能。对于那些希望在编程设计领域取得更好成果的人来说,这本书是一个很好的参考资料。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值