C++ (初始C++,命名空间,引用,函数增强)
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);
}