1. 双冒号运算符: 代表作用域 ,如果前面没有变量代表全局作用域 列如 cout是std下的 而 a 是全局的输出 10
#include<iostream>
int a = 10;
int main(void) {
int a = 5;
std::cout << ::a << std::endl;
return 0; }
2. namespace 使用:
如果都导入一下两个文件,那么函数 goAtk就会不知道用哪一个,所以在使用时 加上 LOL :: goATk()
1.h 文件下的函数
namespace LOL {
void goAtk();
}
2.h下的函数
namespace W {
void goAtk();
}
2.1命名空间下可以放 函数 变量 结构体 类 (必须定义在全局的作用域下) 2.2命名空间可以嵌套 2.3可以往命名空间添加新数据2.4 无名命名空间 : 相当于 static int a = 10 ; static int a = 20 ; 只能在当前文件使用 2.5命名空间可以起别名
namespace {
int a = 10;
int b = 20; }
3.using 关键字
1. 代表使用wyc命名空间下的 a变量, 如果函数类取消注释报错, 因为不知道采用就近还是定义的空间的 二义性
2.如果只是 using namespace wyc ; 这样只是打开了命名空间,不会冲突, 输出采用就近原则 30
3.如果打开多个空间也要考虑二义性
int a = 20;
namespace wyc{
int a = 10; }
int main(void) {
//int a = 30;
using wyc::a;
cout << a << endl; 10 }
4.c++增强
1.函数: 必须参数个数,返回值类型 对应上 , 2.转换类型: char * = (char* ) malloc( 64) 返回值是void * 类型 必须先强转.
3.结构体增强: 可以含有函数名 4.增加bool类型
5.三目运算符返回值为 变量 a>b ? : a ,b 如果a>b 就返回a,而不是返回a的值
5.const
在c语言中: const 饰的全局放在一个只读的区域, 而修饰的 局部可以通过指针修改, 称伪为常量
在c++中 const修饰的局部变量也不能修改(原理是会开辟一个临时的空间, 通过指针修改的不是真正的 指针指向的 值)
尽量使用const 代替 define
6. 引用
1.基本语法 type & 别名 = 原名 2. int a= 10; int & b = a; 相当于把a的地址给了b , 必须 int & b = a
3.初始化 后不能再修改 4.int arr [10] ; int & pArra[10] = arr;
a=20 b=10 如果不使用引用不会改变ab的值
void test(int&a , int&b) {
a = 20;
b = 10;
}
int main(void) {
int a = 10;
int b = 20;
test(a, b);
cout << a <<"\n"<<b<<endl; }
7.内联函数
1. 解决c中宏的缺陷(没有作用域) 函数前面加 inline 函数声明和实现都要加 inline关键字
2.类内部的 函数都会默认会自动加上一个 inline 关键字
3.内联函数只是给编译器的一个建议, 如果函数内部复杂(if for 过多..) 那么inline 不会有效
8. extern c与c++ 的不适配解决
1.在c语言中 使用如下来适配c++ , 在 ifdef 之内写c语言代码
#ifdef __cplusplus
extern "C"{
#endif // __cplusplus
void test() {
//c语言代码
}
#ifdef __cplusplus
}
#endif
2.若果在C++中想使用c语言代码 使用 extern 来适配, 列如show 函数是c语言的函数
extern "C" void SHOW();
9.class 默认权限
1.struct 默认权限是public 而class中 默认权限是 private , 只有本类可以访问,子类不可以修改
2.public 修饰的成员 类外部可以修改, protect 类外部不能修改, 子类可以修改