C/C++的学习笔记(提高部分)

12 篇文章 0 订阅

C/C++的学习

一.总结

      C语言的应用十分广泛、灵活性强,同时它也比较基础,很适合一些刚入门的
  小白学习,若有了C语言的基础,再去学习其他的语言也会轻松很多。我也是一名
  小白,真正入门技术也才半年的时间,这半年的时间里我学习了很多关于技术方面
  的知识,也自己尝试或与他人合作设计完成过一些小的项目(日后也会更新到我的
  博客中)......
      这段时间,我主要在学习C++,由于C语言的基础部分和C++的极其类似,所以
  我在学习C++的同时,相当于复习了一遍C语言。我也重新整理了一份笔记,希望我
  也可以给大家带来一点帮助。
      笔记中有错误的地方,欢迎指出,欢迎大家讨论!

二.C++的提高部分

1. new delete 操作符

在堆区开辟数据:new;它所返回的是开创的该数据类型的指针;

在堆区释放数据:delete

//在堆区开辟一个数据
int * p = new int(10);  //在堆区开辟一个整型数据,这个数据被初始化为10;返回的是int类型的指针
delete p;  //释放在堆区中的整型数据

//在堆区开辟一个数组
int * arr = new int[10];  //在堆区开辟了一个元素个数为10的数组,每个元素都是int类型的;返回的是这个数组的首地址
delete[] arr;  //释放在堆区中的数组([]是为了告诉编译器这里要释放的是一个数组)

//在堆区的数组的赋值(初始化)方法和正常数组一样
int i = 0;
for(i=0;i<10;i++)
{
    arr[i] = i;
}

2.引用:给变量起别名;

语法:数据类型 &别名 = 原名;(这里的数据类型要和原名的数据类型一致)

int a = 10;
int &b = a;  //给变量a起了别名b,意思是,现在变量b也可以像变量a一样,操纵变量a所在的内存

b = 20;
cout << a << endl;  //输出:20

引用注意事项:

1.引用必须初始化;

2.引用在初始化之后,不可以再改变;(原因:引用的实质是一个指针常量


引用做函数参数:

函数传参时,可以利用引用的技术修改实参;(优点:可以简化指针修改实参)

传入参数:

1.值传递:不可以通过形参修改实参;

2.地址传递:可以通过形参修改实参;

3.引用传递:可以通过形参修改实参;(相比地址传递,引用传递的语法更简单更清楚)

//交换函数:

void swap_1(int a,int b)  //值传递
{
	int temp = a;
	a = b;
	b = temp;
}

void swap_2(int * a,int * b)  //地址传递
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void swap_3(int &a,int &b)  //引用传递
{							//引用传递是给变量取别名,只不过这里原名和别名是一样的而已,原名和别名其实都操纵着同一块内存
	int temp = a;
	a = b;
	b = temp;
}

int main()
{
    int a = 10;
    int b = 20;
    
    swap_1(a,b);  //输出:a==10 b==20
    swap_2(&a,&b);  //输出:a==20 b==10
    swap_3(a,b);  //输出:a==20 b==10
    return 0;
}

引用做函数返回值:

注意事项:

1.不要返回局部变量的引用;

局部变量储存在栈区,其会在函数执行完毕后,由编译器自动释放,所以就算函数返回局部变量引用,在 main 函数中再使用都是非法的。同理,函数也不要返回局部变量的地址,因为内存释放后,再通过地址操作这块内存,也是非法操作;

2.函数的调用可以作为左值;

int& test()
{
	ststic int a = 10;  //静态变量,存放在全局区,在程序结束后才会由操作系统释放(避免返回局部变量的引用)
	return a;
}

int main()
{
	int &ref = test();
	test() = 100;  //函数调用做左值,test()在调用后,返回的是一个a的引用,实际上相当于返回了a,所以test()=100,即a=100
    
    cout << a << ref << endl;  //输出:a==ref==100
    retuen 0;
}

引用的本质:引用的本质在 C++ 内部的实现是一个指针常量

int func(int & ref)  //内部发现这是引用,自动转换为:int * const ref = &a;
{
	ref = 100;  //内部发现这是引用,自动转换为:*ref = 100;
}

int main()
{
	int a = 10;
	int & ref = a;  //内部发现这是引用,自动转换为:int * const ref = &a;
                    //指针常量的指向不可以改,这也是引用在初始化之后为什么不可以再修改的原因
	
	ref = 20;  //内部发现这是引用,自动转换为:*ref = 20;
    
    cout << a << ref << endl;  //输出:a==20;ref==20
	
	func(a);
	return 0;
}

常量引用:主要用来修饰形参,防止误操作;

因为在引用传递中,形参是可以修改实参的,假如我有了一个函数,参数传递的方法采用引用传递,并且我不想在函数中修改,但我不小心在函数中有了误操作,这时候用 const 就可以避免;

....(int & a)

....(const int & a)

3.函数提高部分

函数默认参数:C++中,函数形参列表中的形参是可以有默认值的;

语法:

返回值类型 函数名(数据类型 参数名 = 默认值,....)
{
	....
}

如果我们在函数调用时,传入了自己的数据,函数就会使用我们传入的数据;如果我们传入,就会使用函数定义时设置的默认值

注意事项:

1.如果函数参数列表中某个位置有了默认值,那么这个位置往后,从左到右,后面的参数也都要有默认值;

2.函数的声明和函数实现(定义)只能有一个地方有默认参数;(若两个都有默认值,会有二义性,编译器不知道是根据声明还是实现)


函数占位参数:C++ 中函数的参数列表可以有占位参数,用来做占位,调用函数时必须填补该位置;(占位参数也可以有默认参数)

语法:

函数返回值 函数名(数据类型)
{
	....
}

函数重载:函数名可以相同,提高函数的复用性;

满足条件

1.同一个作用域;

2.函数名称相同;

3.函数参数类型不同或者个数不同或者顺序不同;

注意事项

1.函数返回值不可以作为函数重载的条件;

2.尽量避免函数重载时使用默认参数;


C++还在学习中O(∩_∩)O,之后还会更新笔记!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值