Skip to content

C++中的一些坑

1.函数体外只能定义全局变量或者对象,而不能执行语句

具体执行的语句只能写到函数体里,然后调用函数。比如在全局中std::cout << "hello world"是不可以的。只能把他放到一个函数中。

2.单例模式

可以在函数定义时创建一个新的静态变量,然后如果再掉用的时候就不会在执行新建这个指令了。下图中b,c不再新建,而是直接返回a创建的单例地址。

3 类内static、override声明,在类外不需要重复说明,但是const函数需要。

在类内声明时要加static声明,在类外定义时不加。类似的还有override、virtual。但是const不包含在内。

4.类内定义函数时,编译器会自动加上inline,在类外时需要手动在类外定义时加上,而在类内无需加。

5.在google规范中,一般bool func(const B &input,C *output),

这样做的原因是,首先bool天然具有实际的意义,比如一个precess类的函数,天然需要返回是否成功。其次,如果output太多,一般也会这样写。之所以输出写成指针是因为比较好辨别。如果返回的只是一个值,那么A func(const &B)也完全没问题。

6.C++中特殊的构造函数:析构,拷贝构造,拷贝复制,移动构造,移动赋值,遵循三五原则:

也叫三五法则,指的是析构,拷贝构造,拷贝复制,移动构造,移动赋值需要同时出现的消失。要么都定义,要么都不定义。

C++三法则:如果需要析构函数,则一定需要拷贝构造函数和拷贝赋值操作符。 在较新的 C++11 标准中,为了支持移动语义,又增加了移动构造函数和移动赋值运算符,这样共有五个特殊的成员函数,所以又称为“C++五法则”; 也就是说,“三法则”是针对较旧的 C++89 标准说的,“五法则”是针对较新的 C++11 标准说的;为了统一称呼,后来人们干把它叫做“C++ 三/五法则”;

  1. 只要不涉及到指针和内存,就不要去自己声明拷贝构造,拷贝复制,移动构造,移动赋值和析构(五法则,针对C++11之后),默认构造可以用defalut来声明。如果涉及到指针和内存,那么就要遵循三原则(同时定义析构,拷贝构造,拷贝赋值)。 在涉及指针和内存时需要定义析构函数的原因是这样:合成的析构函数不足以释放类所拥有的资源。同时在拷贝中,有指针类型的成员,我们必须防止浅拷贝问题,所以,一定需要拷贝构造函数和赋值操作符,这两个函数是防止浅拷贝问题所必须的。

  2. 不定义移动构造和移动赋值肯定不会出错,但是可能性能较低。

  3. 如果声明了移动操作,则删除拷贝操作(拷贝构造和拷贝复制)

如果一个类定义了一个移动构造函数/移动运算符,则该类的合成拷贝构造函数和拷贝赋值运算符会被定义为删除的(因为生成的会有危险,不如直接删除),也就是说定义了一个移动操作的类也要定义自己的拷贝操作,否则拷贝操作会被默认定义为删除的。

1.

6.什么时候传值和传引用

补充:智能指针,一般也可要传引用。