【无标题】

目录

命名空间 namespace

解决命名冲突

命名空间的特性

1.同名命名空间是可以同时存在,编译器编译时会合并
2.命名空间可以嵌套
3.命名空间不影响声明周期

命名空间的使用

namespace N {
 int a = 10;
 int b = 20;
 int Add(int left, int right)
 {
 return left + right;
 }
 int Sub(int left, int right)
 {
 return left - right;
 }
}
int main()
{
 printf("%d\n", a); // 该语句编译出错,无法识别a
 return 0; }

加命名空间及作用限定符

printf("%d\n",N::a);

使用using将命名空间中成员引入

using N::b;

使用using namespace 引入命名空间

using namespace N;

缺省参数

函数声明或定义时为函数参数设定一个默认值,使用函数时如果没有指定实参采用该默认值
分全缺省和半缺省

半缺省参数必须从右往左依次给出,不能间隔着给
缺省参数不能在定义和声明中同时出现
缺省值必须是常量或者全局变量

函数重载

允许出现多个同名函数
要求形参列表不同,参数类型,参数个数,参数类型有不同
只有返回值不同不能构成函数重载原因 因为返回类型是对于结果的解释,是没有放进c++汇编代码的,但是函数名,函数长度,函数参数类型等是放进了汇编代码的,所以c++是可以认出他们,同时c语言的汇编中函数的解释是没有这么多东西,就是原名,所以这也是c语言不支持函数重载的原因。

引用

引用是给已经存在变量取别名,编译器不会为引用变量开辟内存空间,它和它应用的变量共同用同一块内存空间

用法
类型& 引用变量名=引用实体
int & a=b;

引用的特性
1.引用在定义时必须初始化
2.一个变量可以有多个应用
3.引用一旦引用一个实体,不能再引用其他实体

引用在权限上,只能缩小不能放大

int a=10;
int& b=a;

const int c=100;
int& d=c;//err 放大权限

int e=100;
const int& f=e;//权限缩小

权限深度理解

int main()
{
	double a=3.2;
	int b=a;
	//这里是相当于类型转换,相对与c的隐式转换有所不同
	//因为int和double的存储方式不同
	const int& c=b;
	//这里c作为b的引用,前面要加上const,因为其实用c去引用b是在中间
	//产生了一个临时变量,临时变量具有常性,所以加const,相对于中间产生了一个3
	//
}

引用的使用场景
做参数
1.输出型参数
2.减少拷贝,提升效率
做返回值
传值返回会有一个临时拷贝
为什么要产生临时变量呢?
因为并不是都会像我们这样产生一个静态的局部变量然后去返回,而且确实静态变量在实际中是很少用的,因为会产生一些线程安全的问题,要加锁很麻烦。实际中是很可能不是静态变量的,是局部变量,我们之前是学过了函数栈帧,也知道返回值是存储在寄存器的,如果现在没有那个寄存器且返回局部变量,因为我们已经出了函数栈帧,函数栈帧销毁了,也就是那个局部变量已经销毁了,所以ret就得不到要返回的值,所以编译器为了不考虑是静态变量还是局部变量,就都产生了一个临时变量去存储。(如果数据大的话其实是会在上一层函数提前开辟好空间,然后互相拷贝,了解一下就可以了)

int Count()
{
	static int n = 0;
	n++;
	return n;
}

int main()
{
	const int& ret = Count();//证明函数返回是用一个临时变量存储的
	return 0;
}

传引用返回没有这个拷贝了,函数返回就是返回变量的别名

int& Count()
{
	static int n = 0;
	n++;
	cout<<&n<<endl;
	return n;
}

int main()
{
	int& ret = Count();
	cout<<&ret<<endl;
	return 0;
}

证明ret是n的别名

如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已 经还给系统了,则必须使用传值返回

引用和指针的区别
语法概念上引用是别名,没有独立空间,和其引用实体共同使用同一块空间
底层实现上有实际空间,因为引用是按照指针方式实现的

引用和指针的不同点
1.引用在定义时必须初始化,指针没有要求
2.引用在初始化时引用一个实体后,就不能再引用其他实体,指针可以指向任何一个同类型实体
3.没有NULL引用,但有NULL指针
4.在 sizeof 中含义不同 : 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数
5.引用自加即引用的实体增加 1 ,指针自加即指针向后偏移一个类型的大小
6. 有多级指针,但是没有多级引用
7. 访问实体方式不同, 指针需要显式解引用,引用编译器自己处理
8. 引用比指针使用起来相对更安全

内联函数

  1. 以 inline 修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开 ,没有函数压栈的开销,内联函数提升程序运行的效率。(和c的#define有点像)
  2. inline 对于编译器而言只是一个建议 ,编译器会自动优化,如果定义为 inline 的函数体内有循环 / 递归等
    等,编译器优化时会忽略掉内联。
  3. inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址了,链接就会找不到。

宏的优缺点?
优点:

  1. 增强代码的复用性。
  2. 提高性能。
    缺点:
  3. 不方便调试宏。(因为预编译阶段进行了替换)
  4. 导致代码可读性差,可维护性差,容易误用。
  5. 没有类型安全的检查 。
    C++ 有哪些技术替代宏 ?
  6. 常量定义 换用 const
  7. 函数定义 换用内联函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值