func()等价于func(void)
也就是说在C++中,参数列表为空意味着不接受任何参数。之所以要注意这一点是因为在C语言中,参数列表为空意味着参数不确定。两者的语义是有巨大差别的,作为学了C再学C++的人来说,是需要注意的一点。
void指针无法隐式转换为其它类型指针
需要通过static_cast<T*>
语法来显式转换,同样也是跟C中的语法不一致,C语言中是允许void
指针直接赋值给其它类型指针的。一个最好的体现两者区别的例子就是C和C++中对NULL
宏定义的不同:
#undef NULL
#ifdef __cplusplus
// C++
#define NULL 0
#else
// C
#define NULL ((void *)0)
#endif
char不一定等于signed char
实际上,C++标准中没有规定char
类型的符号,依赖于具体的实现,这一点和其它的整型类型都不同。所以要使用char
类型来进行小整数运算的时候最好明确指定其符号。
const全局变量默认作用域为当前cpp文件
为了能在头文件中定义const
全局变量,C++规定const
全局变量默认具有内部链接属性,若要将其作用域扩大到全工程,那么需要在定义处手动加上extern
关键字:
// 这两行全局变量定义等价
const int MAX = 233;
static cosnt int MAX = 233;
创建struct union enum对象时不必带上这几个关键字
在C语言中是需要带上相应的关键字的,在C++中这几种类型和class
类型一样,只需要写类型名即可:
struct Foo {
int count;
};
// ok
Foo foo;
忽略参数的处理
有时候不需要处理函数调用传进来的一些参数,但如果放置没有用的参数不管可能会引起编译警告甚至错误,这个时候就需要手动指定忽略参数的处理:
// 方法一
void func(int n, int m) {
// 忽略参数m
(void)m;
std::cout << n << std::endl;
}
// 方法二
void func(int n, int) {
std::cout << n << std::endl;
}