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,之后还会更新笔记!