C++入门(二)

目录

一、引用

1.做参数

2.做返回值

3.常量

4.引用和指针

二、内联函数


一、引用

1.做参数

void swap(int* p1,int* p2)
{
}

void swap(int& r1,int& r2)
{
}
int main()
{
    int a = 1,b = 2;

    swap(&a, &b);
    swap(a, b);

    return 0;
}

 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树

BTNode* BinaryTreeCreate(char* a, int* pi)  // c
{}

BTNode* BinaryTreeCreate(char* a, int& ri) // cpp
{}

int main()
{
    char* ptr = "ABD##E#H##CF##G##";
    int i = 0;

    BinaryTreeCreate(ptr, i);

    return 0;
}

 链表的声明

typedef struct Node
{
	struct Node* next;
	int val;
}Node, *PNode;

//*PNode
//typedef struct Node* PNode;

//void SLTPushBack(Node** pphead, int x);  // C

void SLTPushBack(Node*& phead, int x);  // CPP
void SLTPushBack(PNode& phead, int x);

int main()
{
    Node* plist = nullptr;

    SLTPushBack(&plist, 1);
    SLTPushBack(plist, 1);

    return 0;
}

2.做返回值

①减少拷贝

传值返回,需产生临时变量,将n的值拷贝到临时变量内在传给ret;

int& Count()
{
	static int n = 0;
	n++;

	return n;
}

int main()
{
    int ret = Count();

    return 0;
}

 ②调用者可以修改返回对象

return ay.a[i] 的返回类型为int&,是别名,所以数组内的值可进行更改

#define N 10
typedef struct Array
{
	int a[N];
	int size;
}AY;

int& PosAt(AY& ay, int i)
{
	assert(i < N);

	return ay.a[i];
}

int main()
{
	AY ay;
	for (int i = 0; i < N; ++i)
	{
		PosAt(ay, i) = i*10;
	}

	for (int i = 0; i < N; ++i)
	{
		cout << PosAt(ay, i) << " ";
	}
	cout << endl;
	

	return 0;
}
//0 10 20 30 40 50 60 70 80 90

3.常量

指针和引用,赋值/初始化 ----权限可以缩小,但是不能放大 

//int main()
//{
//	int a = 1;
//	int& b = a;
//
//	// 权限放大
//	/*const int c = 2;
//	int& d = c;
//
//	const int* p1 = NULL;
//	int* p2 = p1;*/
//
//	// 权限保持
//	const int c = 2;
//	const int& d = c;
//
//	const int* p1 = NULL;
//	const int* p2 = p1;
//
//	// 权限缩小
//	int x = 1;
//	const int& y = x;
//
//	int* p3 = NULL;
//	const int* p4 = p3;
//
//  return 0;
//}

 rd为double类型,进行类型转换时,产生临时变量,而临时变量不可修改;const修饰的变量在C++中被看作是常量也不可修改,此时可认为const是对临时变量做修饰。

	int i = 10;

	cout << (double)i << endl;

	double dd = i;

    //double& rd = i;
    const double& rd = i;

4.引用和指针

相同点:

语法概念上 引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
底层实现上 实际是有空间的,因为 引用是按照指针方式来实现 的。
引用和指针的汇编代码对比:

 

 不同点:

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

二、内联函数

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

注意:

内联函数不能声明和定义同时存在,因为在展开的时候在声明处找不到函数,因此直接在".h"处定义即可。 

(未完待续......)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值