网站网络营销外包北京网站seo优化推广
c++使用指令 g++进行编译
头文件通常引用 #include <iostream>
编写前需加上 using namespace std;
char* 本身是指向字符数组首元素的指针,但字符串常量是字符数组(多个字符连续存储),所以当char* 指向它时会指向数组第一个元素,但C++中字符串的字面量时const char[],转换为char*会丢失const,所以会导致类型不匹配
命名空间
C++中提供了命名空间来解决同名引起冲突的问题,一个命名空间就是一个作用域,在不同命名空间中命名的相同符号代表不同的实体
namespace 名称{成员}
命名空间通过关键字 namespace来创建,成员可以是函数,变量,常量,枚举/结构体/联合体,类,嵌套名字空间
名称是定义的命名空间的名字
通过 命名空间名称::成员 的方式来使用成员
int main(){A::global=500;A::function();}
使用 using namespace 命名空间名称 来使用命名空间的所有成员
using namespace A;int main(){global = 50;function();}
声明使用命名空间中的一个成员
using A::global;
int main(){global = 50;}
命名空间可以有许多别名,互相都可以使用
namespace A{int global;
}namespace A_ll = A;int main(){A::global = 50;A_ll :: global = 50;
}
定义在函数之外的变量是定义在全局命名空间中的,必须通过 :: 名称 来使用
int global = 0;void function(){}int main(){::global = 0;::function(); }
未命名的命名空间为匿名命名空间,不能跨文件使用,只能在该文件中直接使用
namespace{int global = 0;
}int main(){global = 0;// 直接使用,不能跨文件}
引用
引用就是对变量或对象的别名,可以替代C语言中通过指针修改变量的值的方法,对引用对象进行的操作与其绑定对象完全一致
格式为: 类型 &引用名 = 目标变量名
int main(){int a = 0;int &AA = a;AA = 20;cout << a <<endl; // 20}
需要注意:
&不是地址运算符,只起标志作用
引用类型必须与变量类型相同
引用相当与一个别名,不能再将这个别名用作别的变量的别名
引用操作编译器会翻译为指针操作,所以引用的本质是指针
如何获取变量类型 : 将变量名称去掉,剩下的就是类型
对指针的引用: 类型* 引用名 = 指针名
int main(){int global = 0;int * pera = global;int* &peraa = pera;}
对数组的引用: 类型 (&引用名)[数组中元素个数] = 数组名
int main(){int a[2]={};int (&b)[2] = a;}
作为函数参数,可直接修改变量的值
void charge_value(&date){date = 100;}int main(){int date = 10;charge_value(date);cout<<date<<endl; // date = 100}
常引用 const 类型 & 引用名 = 变量
不可通过该引用对其所绑定的对象进行修改
引用和指针的区别 :
引用必须被初始化,不能为空,但指针可以
指针在程序运行的时候可以改变它的值,但引用一旦绑定一个变量就不能在绑定其他变量
sizeof(引用) 得到的是引用对象的大小 sizeof(指针) 得到的是指针本身的大小
引用只能为一级,但指针可以是多级
const 与 指针
int b = 2;
int a = 1;
const int* p =&a;p = b;
//不可以写 *p = b , 因为const修饰的是int *,使用*就会报错
同理可推出
int a = 1;
int b = 2;int * const p_x = &a;*p_x = b;// p_x = b 会报错const int* const p_x = &a;// p_x = b 和 *p_x = b 均会报错
const 与 引用
int a = 0;const int & p = a;a = 10;// p = 10 会报错
函数增强
默认值参数 : 在函数声明时为函数提供一个默认值,如果没有传参则默认使用默认值
void function (int a,int b,int c = 100){}int main(){function(10,20);//C默认使用100}
当函数的定义和声明分开时,默认参数只能放在声明处
extern int function(int a,int b,int c = 100);//函数的声明int main(){}int function(int a,int b,int c){}
如果某个参数是默认值参数,那他后面的参数都必须是默认值参数
内联函数 : 将函数直接调到使用的地方,可以避免反复的跳转,减少内存消耗
递归函数无法使用内联函数
内联函数格式
extern int add(int a,int b)__attribute__((always_inline));inline int add(int a,int b){}int main(){add(1,2);}