C++面经总结之《Effective C++》(二)

在这里插入图片描述

前言

今天和老大哥们聚会,又接触了不少新事物。
争取今天把这个系列整理完,最近信息有点太多了,分析不过来了。先屯着,慢慢发。
请大家给我点时间,我缓一下。

接下来,将会有大动作了。


13、智能指针

我就不多说,直接用。

18、让接口更容易被正确使用,不易被误用

中间跳过一波,不为啥,看不懂。

这个条款让我想起了“模板方法模式”,但是我讲不清楚这个模式,倒不是讲不清楚该怎么用,就是讲不清楚有什么用。现在又知道一个用法了。

就拿我做的第一个小demo来说,是一个输入输出控制函数。
这个demo也被广泛的应用与我的教学工作中,虽然最后交上来的答案都不是很理想,我且说,有兴趣的朋友自行实现:

1、语言不限,最好是C/C++,Python封装的太好了,体现不出我们的水平
2、输入一个字符串
3、我要控制输入的为纯英文
4、我要控制输入的为纯数字
5、我要控制输入的可以有英文、数字、标点混搭
6、基于以上3/4/5,我要控制输入长度一定
7、我输错了要支持回删
8、我要密文输入,不能在屏幕上显示我输入的是什么

这就是模板,错误输入将不被计数。
总好比屏幕上写一行:请输入英文、数字,然后我依旧可以随便输入,我输入一堆的标点,输入完跟我说输入不合法。不合什么法?不合法你允许我输入?


22、将成员变量声明为private

我一直是这样做的。
那就这样。


23、以non-member、non-friend替换member函数

以前不知道怎么回事,觉得老师这样是多一举,现在知道了。这还是模板方法模式。为了保护封装性。

假设:

class A{
    
    
public:
	a();
	b();
	c();
}

解决一个方案,需要依次调用abc,难道要在场景类里面:

A *AA = new A();
AA->a();
AA->b();
AA->c();

?

还是

class A{
    
    
public:
	run(){
    
    
		a();
		b();
		c();
	}
}

int main(){
    
    
	AA->run();
}

你怎么看?


26、尽可能延后变量定义式的出现时间

有的书或者教程会打着编程规范、编程艺术的幌子,跟你说变量定义统一写在函数的开头。在C语言里面才这样,不这样后面的变量将会无法分配资源,导致报错。但是C++并不这样。

你要清楚,一旦函数内部出现了分支,则有些对象可能根本不会有出镜的机会,那你那么急吼吼的定义它干嘛?

一旦涉及到变量定义,就会有构造和析构成本,不管它有没有被用上。

你不止应该尽可能延后变量的定义,最好延后到这个变量能够被赋值的那一刻。


当然,具体情况具体分析,如果遇到了循环中的临时变量,那另当别论。

循环无非两种情况,循环外定义和循环内定义:

11个构造函数+一个析构函数+n个赋值操作
2、n个构造函数+n个析构函数

如果赋值的成本小于构造+析构的成本(变量不大),那就选择第一种方式。
这时候就看经验了。


27、尽量少做转型动作

如果是你自己的转型操作,还是少做,尽量不做。
因为不同编译器,或者不同平台,它们可能不互认的。


31、将文件间的编译依存关系降至最低

该用就得用呗,这要怎么降低?咱又不会吃饱撑着没事儿去引用一个用不着的头文件。


到这儿吧

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/115033379