1、new
一般情况下,如果new为申请到空间(内存耗尽的情况下),会抛出一个bad_alloc异常
通过nothrow可以阻止其抛出异常,用法如下:
char *p2 = new (nothrow)char; // 申请失败后,会返回nullptr,不会抛异常
2、利用using代替typedef
using FunctionPtr = void (*)(); //相当于 typedef void (*FunctionPtr)();
FunctionPtr ptr = f;
3、相同类的各个对象互为友元
方框内的函数,就是在改变其他对象的私有成员变量
线程池实现
https://github.com/abseil/abseil-cpp/blob/master/absl/synchronization/internal/thread_pool.h
C++实现线程池_c++ thread使用lambda表达式初始化_蓬莱道人的博客-CSDN博客
C++11并发学习之六:线程池的实现_c++11并发学习之六 线程池的实现_草上爬的博客-CSDN博客
4、lambda表达式
C++11 之 lambda函数的详细使用_内核之道的博客-CSDN博客\
https://blog.csdn.net/CSDN_WHB/article/details/102023429
5、变长参数模板
template
<
class
... Types>
struct
Tuple { };
https://www.cnblogs.com/zenny-chen/archive/2013/02/03/2890917.html
6、Be alert for C++'s most vexing parse
https://www.cnblogs.com/yangyingchao/p/3394146.html
class Widget
{
public:
Widget(){}
virtual ~Widget(){}
void Show(){}
};
Widget w(); // 本行可能会被编译器认为是一个函数声明(解决方法 Widget w;)
w.Show(); // 由于上一行的问题,本行会报错
7、Be alert for C++'s most vexing parse
class AsyncDestructHelper final {
public:
AsyncDestructHelper() {}
~AsyncDestructHelper() {}
static AsyncDestructHelper* GetInstance() {
static AsyncDestructHelper async_ins;
return &async_ins;
}
template<typename Type>
void AddDestructElement(std::unique_ptr<Type>&& element) { // NOLINT
thread_pool_.Schedule([&element]() mutable {
element.reset();
});
}
private:
// ThreadPool 找开源即可
static ThreadPool thread_pool_;
};
int main() {
std::unique_ptr<int> i_t(new int);
AsyncDestructHelper::GetInstance()->AddDestructElement(std::move(i_t));
}
C++编译原则
1、只要表达式可以被解析成 函数 ,那么该表达式 就会被编译器解析成函数 !
2、给形参声明加上括号不合法,但给函数调用的实参加括号是合法的