c++基础(对c的扩展)

文章目录

命令空间

定义

namespace是单独的作用域 两者不会相互干涉

cpp 复制代码
namespace 名字
{
//变量 函数 等等
}


eg
namespace nameA {
	int num;
	void func() {
		cout << "nameA";
	}
}

namespace nameB {
	int num;
	void func() {
		cout << "nameB";
	}
}

使用

::作用域操作符, 空间名::成员

cpp 复制代码
cout << nameA::num<< "==" << nameB::num << endl;

注意

  • 命名空间只能再全局范围内定义
  • 可以嵌套定义
cpp 复制代码
namespace nameA {
	namespace A {
		int num;
	}
	int num;
	void func() {
		cout << "nameA";
	}
}
  • 命名空间声明和实现可以分割开来
  • 命名空间可以起别名
cpp 复制代码
namespace studentInfoHandle {
	int id, age;
	string name;
	void studying() {
		cout << "i am studying" << endl;
	}
}
// 别名
namespace sIH = studentInfoHandle;

引用

基本

引用可以看作一个已定义变量的别名

语法:Type&name=var;

注意:

  • &在这里不是求地址运算,而是起标识作用
  • 类型标识符是指目标变量的类型
  • 必须在声明引用变量时进行初始化
  • 引用初始化后不能改变(值可以变 引用不可变=》不可以引用其他的变量)
  • 不能有NULL引用。必须确保引用是一块合法的存储单元的关联
cpp 复制代码
//一改均改
	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

引用所占空间大小和指针相同

cpp 复制代码
int &p=a; ==  int* const p=&a;

引用作为参数

cpp 复制代码
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
  • 引用作为其他变量的别名存在 一些场合下可以替代指针
  • 引用相比于指针有更好的可读性和实用性

引用的使用场景

对象中使用多 后续来看

内联函数

引出

宏实现简单函数

宏操作在预处理阶段就是简单的文本替换 没有类型检查

cpp 复制代码
#define ADD(x,y) x+y

// 要300 则x+y加上括号
int res = ADD(20,10)*10; //希望是300 但是实际上是 20+10*10=120

因此引出了内联函数

内联函数是一个真正的函数,但是没有函数的调用开销,又像普通函数一样可以传参返回值

相比于宏:既保持了宏函数的效率,又增加了安全性。

基本概念

定义
inline void func(){}

c++规定 内联函数的声明和定义必须放在一起

注意

  • 推荐使用内联函数替代宏代码片段
  • 内联函数在最终生成的代码中是没有定义 的,所有内联函数的作用域可以理解位只在定义的文件中。那个文件调用那个文件就要定义,不能跨文件访问
  • inline只是对编译器的一个内敛请求,c++内敛编译会有一些限制,以下情况编译器可能考虑 将函数进行内敛编译:
    • 存在任何形式的循环语句
    • 存在过多的条件判断语句
    • 函数体过于庞大
    • 对函数进行取址操作

函数补充

默认参数

cpp 复制代码
// 带有默认参数被声明了 实现得使用就不需要传入默认参数了
//声明
int func(int r,double PI=3.14);
//实现
int func(int r,double PI){}

int func(int r=1,int f); // 错误得

注意事项

  • 默认参数后面得参数必须都是默认参数
  • 带有默认参数函数被声明了,那么实现得使用就不需要传入默认参数了

函数重载

c中

c 复制代码
void func(){}
void func(int x){}

//报错 不允许 认为是一个函数

c++中函数重载定义

同一个函数名定义不同的函数

函数名和不同的参数搭配时函数的含义不同

条件

  • 作用域相同
  • 参数的个数不同
  • 参数的类型不同
  • 参数的顺序不同
cpp 复制代码
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);

函数重载的原理

  1. 编译器在将程序编译完成后会将变量和函数变成一个个的符号,存放这些符号的表格称为符号表
  2. 对程序进行编译查看对应函数的符号
sh 复制代码
# 编译命令
g++ -c main.cpp

# 执行命令  查看符号表 
nm main.o

g++编译器在将函数转化为符号时,根据函数名、形参类型进行转化

如果使用g++编译c语言含义函数重载的代码,是编译成功的。

相关推荐
波音彬要多做3 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
捕鲸叉3 分钟前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
Noah_aa13 分钟前
代码随想录算法训练营第五十六天 | 图 | 拓扑排序(BFS)
数据结构
KpLn_HJL1 小时前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
Schwertlilien1 小时前
图像处理-Ch5-图像复原与重建
c语言·开发语言·机器学习
只做开心事1 小时前
C++之红黑树模拟实现
开发语言·c++
程序员buddha2 小时前
C语言从入门到放弃教程
c语言·开发语言
程序员老冯头2 小时前
第十五章 C++ 数组
开发语言·c++·算法
程序猿会指北3 小时前
【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler
c++·性能优化·harmonyos·openharmony·arkui·启动优化·鸿蒙开发
AAA.建材批发刘哥6 小时前
Linux快速入门-Linux文件系统管理
linux·运维·服务器·c语言·学习方法