定义
namespace是单独的作用域 两者不会相互干涉
namespace 名字
{
//变量 函数 等等
}
eg
namespace nameA {
int num;
void func() {
cout << "nameA";
}
}
namespace nameB {
int num;
void func() {
cout << "nameB";
}
}
使用
::作用域操作符, 空间名::成员
cout << nameA::num<< "==" << nameB::num << endl;
注意
namespace nameA {
namespace A {
int num;
}
int num;
void func() {
cout << "nameA";
}
}
namespace studentInfoHandle {
int id, age;
string name;
void studying() {
cout << "i am studying" << endl;
}
}
// 别名
namespace sIH = studentInfoHandle;
引用可以看作一个已定义变量的别名
语法:Type&name=var;
注意:
//一改均改
int a = 50;
int& b = a;
b = 100;
//均是100
cout << a << endl;
cout << b << endl;
int& c = a;
c = 500;
//均是 500
cout << a << endl;
cout << b << endl;
cout << c << endl;
//地址 相同
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
引用的本质是一个常指针
int * const p
引用所占空间大小和指针相同
int &p=a; == int* const p=&a;
typedef struct Teacher {
int id, age;
};
void changeT(Teacher& t) {
t.age = 100;
}
/*
编译后 两者的功能是一样的
void changeT(Teacher* const t) {
t.age = 100;
}
*/
Teacher t;
t.age = 50;
changeT(t); //会改变结构体t的age的值
cout << t.age << endl; //100
对象中使用多 后续来看
宏实现简单函数
宏操作在预处理阶段就是简单的文本替换 没有类型检查
#define ADD(x,y) x+y
// 要300 则x+y加上括号
int res = ADD(20,10)*10; //希望是300 但是实际上是 20+10*10=120
因此引出了内联函数
内联函数是一个真正的函数,但是没有函数的调用开销,又像普通函数一样可以传参返回值
相比于宏:既保持了宏函数的效率,又增加了安全性。
定义
inline void func(){}
c++规定 内联函数的声明和定义必须放在一起
注意
// 带有默认参数被声明了 实现得使用就不需要传入默认参数了
//声明
int func(int r,double PI=3.14);
//实现
int func(int r,double PI){}
int func(int r=1,int f); // 错误得
注意事项
c中
void func(){}
void func(int x){}
//报错 不允许 认为是一个函数
同一个函数名定义不同的函数
函数名和不同的参数搭配时函数的含义不同
namespace function0 {
void fun() {cout << "func" << endl;}
void fun(int x) { cout << "func(int x)" << endl;}
void fun(int x,int y) { cout << "func(int x,int y)" << endl;}
void fun(int x,char y) { cout << "func(int x,char y)" << endl;}
void fun(char x, int y) { cout << "func(char x,int y)" << endl;}
}
function0::fun();
function0::fun(1);
function0::fun(1,2);
function0::fun(1, 'a');
function0::fun('a', 1);
# 编译命令
g++ -c main.cpp
# 执行命令 查看符号表
nm main.o
g++编译器在将函数转化为符号时,根据函数名、形参类型进行转化
如果使用g++编译c语言含义函数重载的代码,是编译成功的。