目录
一,普通函数
1.1 静态函数
eg:static T Func(); // static修饰普通函数,主要是限定其链接性。
普通函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用,限定其链接性。
作用:
a,与其他文件里面的函数命名不会冲突。
b,防止其他CPP文件使用该函数。
1.2 const函数
const T Func(); // 修饰函数的返回值,有如下类型:const T*、const T&、const T
作用:
a,防止外界修改函数返回值
1.3 static+const函数
static const T Func(); // 见上述1.1节+1.2节
1.4 宏函数
#define Func(t1, t2) ((t2) - (t1)) // 注意t2和t1需要用括号括起来,原因
作用:
a,在预编译阶段,宏函数会直接展开,替换原有的代码,少了入栈出栈流程,减少栈内存
b,宏函数缺少了入参类型的校验,比较容易出错,一般建议小型函数使用。
拓展:C/C++宏连接符'##'和'#'的用法 (实际工程化代码经常使用到宏连接符)
1.5 重载函数
二,与类相关函数
注意:下面的Func() 都为类的成员函数
2.1 构造函数系列
2.1.1 默认构造函数
如果程序员不手动编写类的构造函数,编译器自动会生成一个默认构造函数。
使用 = default,显示指示编译器生成默认构造函数 。
使用 = delete,禁止类的某个成员函数实现,一般使用在类的单例模式、unique_ptr中。
2.1.2 构造函数
程序员手写的普通构造函数。
C++ explicit关键字详解,防止隐式转换,与此对应的是 implicit,支持隐式转换。
2.1.3 默认拷贝(复制)构造函数
如果程序员不手动编写类的构造函数,编译器自动会生成一个默认拷贝(复制)构造函数。注意:如果涉及到内存资源的操作,默认构造函数只会进行浅拷贝,而不是深拷贝。
2.1.4 拷贝(复制)构造函数
Class(const Class& class)
如果涉及到内存资源的操作,需要完成深拷贝的操作。
2.1.5 赋值操作符
Class& operator=(const Class& class);
2.1.6 移动构造函数
2.1.7 移动赋值操作符
移动构造函数和移动赋值运算符记得加上noexcept声明,否则编译器还是会调用拷贝构造函数,因为编译器认为不加noexpect是不安全的。
2.1.8 委托构造函数
2.2 析构函数
注意:如果是基类,析构函数需要设置为虚函数。
c++为什么基类的析构函数要写成虚析构函数(也说明了构造函数不能为虚函数的原因)
2.3 const成员函数
void Func() const; // 表示在该函数中不会修改类对象的成员变量值
注意:mutable修饰的成员变量可以在const成员函数中修改,某种意义上来说:破坏了const成员函数的规则。c++ 关键字 mutable
2.4 内联(inline)函数
2.5 虚函数和纯虚函数
virtual void Func(); // 虚函数
virtual void Func() = 0; // 纯虚函数
2.6 static(静态)成员函数
static void Func(); // 类的静态成员函数,为类对象共有方法,一般采取 类名::函数名 调用该函数
2.7 友元函数
三,与结构体相关的函数
3.1 结构体的初始化函数
在设计结构体时,一般建议附带上结构体初始化函数,减少脏数据的影响。结构体初始化(构造函数法)
四,拓展
4.1 函数指针
在C语言中,函数指针通常用来实现面向对象编程,