static
就成局部静态变量了,不给初始值会执行值初始化(内置类型默认为0)传实参不用类型一模一样,能转换就行
可以传递数组(传的是首元素指针,所以形参的大小写不写无所谓)或函数(会转换为函数指针)
数组的引用作为形参,则必须指定大小了,而且传的时候也不能乱传了
有的类型不支持拷贝(比如IO),也就不能传值,所以只能传引用
对于形参为const
的情况,实参不const
也行,但是函数里就别想改值了
对于形参为const
引用的情况,使用引用只是为了避免拷贝的开销,仍然不可以更改值
如果指针是底层const
的也就是它是指向const
值的指针,那么则不可以通过指针的方式来改,但是实际上是可以改的
非const
的引用或指针形参会导致可接受参数范围的缩小,因为编译器不允许将真的不能改的东西传到可以改的地方
处理不同数量实参,如果类型相同,可以使用initializer_list
做形参,类型不同的话则需要写一个可变参数模板
initializer_list
里的值都是const
,并且拷贝赋值操作并不是真的拷贝而是共用,相当于一个vector
,有size
,也有begin
和end
(不是迭代器而是指针),传实参的时候,实参要用大括号括起来
...
也可以用来处理不同数量实参,但一般跟C用,C++中的类传到这种形参一般都拷贝的不对
void
的函数如果返回一个返回void
的函数没问题,要是其他值则不行cstdib
中的EXIT_SUCCESS
和EXIT_FAILURE
是预处理变量,与机器无关typedef
或者using
简化的话 就用尾置返回,也属于骚操作const
参数的const
会被忽略,所以有无顶层const
的两个函数不能算重载,而算重复定义const
可以算重载,因为确实这样更严格const
>类型提升>类型转换>类类型转换nullptr
或者0
时,表示目前不指向任何函数,而不是代表没有类型inline
就行了,到底联不联交给编译器决定constexpr
因为是内联函数所以也要遵守这个规则constexpr
函数return
(这样才能保证编译时知道结果),那么这种函数就可以赋给constexpr
表达式,因为这都是编译时候干的事,所以constexpr
默认设置为内联的constexpr
那么函数就算生成常量表达式也不会返回常量表达式,因为普通函数就是要运行才知道结果constexpr
函数可不一定返回常量表达式,当传递非常量,编译时就计算不出值了,也就返回非常量表达式了assert
预处理宏cassert
头文件中,其实也是预处理变量,像一个内联函数,assert(表达式)
对表达式求值,一旦为假,就终止程序,真的话就啥也不做,assert
干不干活依赖的是NDEBUG
这个预处理变量的状态,如果定义了就啥也不做,默认是没定义的assert
可不是语法糖,因为只要定义NDEBUG
,就真的不干活了,程序就可能会出问题,它只是用来做正式发布后就不做的调试NDEBUG
和#ifndef
和#endif
来创建调试的代码,在命令行输入-D NDEBUG
则之间的代码就不运行了__func__
静态局部变量来输出当前函数的名字, __FILE__
, __LINE__
, __TIME__
, __DATE__
分别表示文件名,行数,编译时间,日期,用来为调试输出信息原文:https://www.cnblogs.com/NoteofZy/p/14820052.html