【C++】c++入门

1. 命名空间

1.1 命名空间的定义

namespace txl
{
	// 命名空间中可以定义变量/函数/类型/命名空间
	int rand = 10;

	int Add(int left, int right)
	{
		return left + right;
	}

	struct Node
	{
		struct Node* next;
		int val;
	};

	namespace tt
	{
		int rand = 1;
	}              //命名空间的嵌套
}

同一个工程中允许存在多个相同名称的命名空间,编译器最后会合并同一个命名空间中。
std是C++标准库的命名空间。

1.2 命名空间的使用

  1. 作用域限定符:加命名空间名称及作用域限定符,eg: txl::rand
  2. 部分展开(授权):使用using将命名空间中某个成员引入
using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;    
}
  1. 全部展开(授权):使用using namespace 命名空间名称引入,eg: using namespce N;
    注意:若展开部分和全局矛盾,则不能展开

2. 缺省参数

指函数有默认参数。
没有传参时,使用参数的默认值
传参时,使用指定的实参

1. 全缺省参数
void Func(int a = 10, int b = 20, int c = 30);
   显示传参,从左往右显示传参
   Func(1);    
   Func(1,2);     
   Func(1, 2, 3);
2. 半缺省参数
void Func(int a, int b = 10, int c = 20);
   必须从右往左给缺省值

注意:. 缺省参数不能在函数声明和定义中同时出现,声明给缺省参数,定义不给(正常写)。

3. 函数重载

指:多个函数的名字,作用域相同,参数个数不同或参数类型顺序不同,它们返回值可相同,可不同,可没有。
在这里插入图片描述

int Add(int left, int right)
double Add(double left, double right)

4. 引用

 int& ra = a;    //ra是a的别名,两者地址相同,是同一块空间的不同名字

4.1 引用特性

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

4.2 引用使用场景

  • 做参数,使形参改变实参
    void Swap(int& left, int& righ)
  • 做返回值
    注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用,例如:静态变量,堆上的变量
    引用返回,如果已经还给系统了,则必须使用传值返回。

4.3 引用优点

  • 传引用传参(任何时候都可以用)
    1、提高效率,若用二级指针传参,则还需要解引用
    2、输出型参数(形参的修改,影响的实参)
  • 传引用返回(出了函数作用域对象还在才可以用)
    1、提高效率,不用去创建临时变量
    2、修改返回对象
    在这里插入图片描述

4.4 引用权限

  • 在引用的过程中,权限可以平移,权限可以缩小,权限不能放大。
    临时变量具有常性。
int func()
{
	int a = 0;

	return a;
}

int main()
{
    //关于引用权限
	const int a = 0;

	// 权限的放大
	// int& b = a;    错误
	//int b = a; 可以的,因为这里是赋值拷贝,b修改不影响a

	// 权限的平移
	const int& c = a;

	// 权限的缩小
	int x = 0;
	const int& y = x;

    //关于临时变量的创建和常性
	int i = 0;
	const double& d = i;   //两者类型不同,会创建临时变量,所以这是权限的平移
    const int& ret = func();  //传值返回,会创建临时变量,所以这是权限的平移
	return 0;
}

5. 内联函数

宏函数的缺点
1、容易出错,语法坑很多
2、不能调试
3、没有类型安全的检查

宏函数的优点
1、没有的类型的严格限制
2、针对频繁调用小函数,不需要再建立栈帧,提高了效率

5.1 概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
在这里插入图片描述

5.2 特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率
  2. 内联说明只是向编译器发出的请求,一般若函数超过10行,编译器会自动忽略这个请求
  3. inline不建议声明和定义分离,要在同一个文件内,分离会导致链接错误。因为inline被展开,不会生成符合表,就没有函数地址了,链接就会找不到。
  4. 可以在多个文件中定义同一个内联函数,因为内联函数被展开,项目不会生成符合表多个相同函数地址,不会产生冲突
  5. 直接将内联函数定义放在头文件即可,要用内联函数,包个头文件就好
    在这里插入图片描述

6. auto关键字

auto自动推导类型

int a=0;
//int b=a;
auto b=a;
// 范围for
// 依次取数组array中的数据赋值给e
// 自定判断结束
// 自动迭代
int array[] = { 1, 2, 3, 4, 5 };
for (auto e : array)  
{
	cout << e << " ";
}

void TestFor(int array[])
{
	for (auto& e : array)   //在这里报错,array必须为数组名,array在这里其实是指针
		cout << e << endl;
}

6.1 auto不能推导的场景

  1. 不能做参数
  2. 不能声明数组

7. 指针空值nullptr

c语言:#define   NULL   ((void *)0)    //NULL实际是一个宏
c++ :#define  NULL   0
     #define   nullptr   ((void *)0)
  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值