目录
前言
知识点
指针空值
c++输入输出
引用
缺省参数
函数重载
auto
范围for循环
后记
在学完c语言之后,很多小伙伴想要进攻c++领域,但是不知道如何巧妙且得当的过渡过去,在看到一段c++代码后,会发出这样的疑问,cin、cout是啥?&不是取地址符号嘛?咋两个函数名一样也可以正常编译通过呢?定义函数时怎么可以直接初始化形参列表的变量? ......
那么,想过渡到c++,又不知道从何下手,可以看看下面本笔者为大家准备的c++入门必备知识点,对家成功进军c++领域或许有些帮助。
我们知道,在c语言中,定义一个指针变量,必须初始化,但是不知道该初始化为啥时,就会把它置为空,eg:int* ptr=NULL;这里的NULL在c中被定义为0(#define NULL 0),这样就很不合理,因为0属于整数(int),而等号左边是个指针变量,所以c++引进nullptr表示指针空值,nullptr被定义为((void*)0),即将整数0强转成一个空指针变量。
eg:
int* ptr = nullptr;
在c中,加入头文件
,就可以使用scanf、printf函数完成输入输出,在c++中,加入头文件 ,可以使用cin、cout这样的流对象,此外endl是特殊的c++符号,表示c中的换行符('\n'),用来换行,<<和>>是特殊的运算符。 而且,不需要像c那样%d、%c指定类型输出,cin、cout可以自动识别类型。
eg:
int a = 0;
cin >> a;// 输入10
cout << "a=" << a << endl;//a=10
对于引用(&)这个概念,想必在学习c++之前就听闻其名,实际上引用就是为变量起别名,不是新定义了一个变量,也不是额外开辟了空间,而是与被引用的变量共用一块地址空间。
注意:1.引用在定义时必须初始化
2.一个变量可以有多个引用,即可以有多个别名
3.初始化之后不能再更改,即引用了一个变量之后,必能再引用其他变量
4.引用类型必须与被引用变量类型相等
eg:
int a = 10;
int& b = a;
cout << a << endl; //10
cout << b << endl; //10
b = 20;
cout << a << endl; //20
cout << b << endl; //20
用处:
1)传参
在c中,我们知道有传值调用和传址调用两种方法,传值调用只是对变量的一份临时拷贝,形参的改变不影响实参,传址调用是传变量的地址过去,形参的改变影响实参,在c++中,可以使用引用的方法,因为引用变量是与被引用变量共用一块地址,所以用引用传参,也能实现形参的改变影响实参。
eg:
void Swap(int& x, int& y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(a, b);
cout << a << endl; //20
cout << b << endl; //10
return 0;
}
2)作为返回值
在一个函数中,需要返回的变量也可以通过引用传回来,但是值得注意的是,一定是返回不会销毁回收的变量,比如,有static修饰的静态变量、数组中的元素,就像在c中不能从函数返回一个函数结束就销毁的地址。
eg:
int& find(int arr[], int pos) //pos为所查找元素的下标
{
return arr[pos];
}
int main()
{
int arr[] = { 1,2,3,4,5 };
find(arr, 1)++;
find(arr, 2) += 8;
find(arr, 3) *= 3;
//打印数组元素
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
cout << arr[i] << " " << endl;
cout << endl; //结果为1 3 11 12 5
return 0;
}
缺省参数就是在定义函数时,为参数列表的参数指定一个缺省值,如果调用函数时指定了实参,就用实参的值,否则就用缺省值。
注意:
1.缺省参数必须从右向左依次给出,不能跳着给,eg:void func(int a,int b=10,int c=20){ ... }(正确),void func(int a=10 ,int b, int c=20){ ... }(错误)
2.调用含缺省参数的函数时,实参列表必须从左向右给出,eg:func(1,2)中1是a的形参,2是b的形参,c没有实参,使用缺省值。
3.缺省参数不能在函数声明和函数定义同时出现,建议在声明中缺省,如果声明中没缺省,定义中缺省了,缺省值不起作用
eg:
void func(int a = 10)
{
cout << a << endl;
}
int main()
{
func(); //10
func(20); //20
return 0;
}
在c++中,对于同一个作用域,可以出现同名函数,但是这些同名函数的形参列表的参数个数、类型或者类型顺序不同。
注意:函数重载针对于形参列表,返回值不同不构成重载
意义:使用一个函数名实现多种相似功能,在调用时很方便,不用考虑因为传入参数列表不同来选择使用哪个函数。
eg:
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
int main()
{
int a = 10, b = 20;
double c = 10.1, d = 20.2;
cout << Add(a, b) << endl; //30
cout << Add(c, d) << endl; //30.3
return 0;
}
面对大量复杂且多的类型,c++引入auto根据初始化表达式来推导变量类型,所以使用auto时必须初始化,在编译时期编译器会将auto替换成变量实际点的类型。
注意:
1.auto与指针或者引用结合起来使用,eg:int a=10; auto* b=&a是强调b是个指针变量
2.使用auto在同一行定义多个变量时,所有变量必须是同一种类型,否则会报错,eg:auto a=10,b=20;(正确);auto c=10,d=20.2;(报错)
3.auto不能作为函数参数,eg:void test(auto a);(错误)
4.quto不能用来声明数组,eg:auto arr[]={1,2};(错误)
eg:
auto a = 10;
auto b = 3.14;
cout << typeid(a).name() << endl; //int
cout << typeid(b).name() << endl; //double
在一个有范围的集合之中,比如一个数组,可以使用范围for循环来遍历其中的元素,语法:for(范围内用于迭代的变量 :被迭代的范围){ ... }
注意:范围for循环的范围必须是确定的,eg:void func(int arr[]) { for(int i : arr) { ... } }(错误),因为函数中的arr只是元素首地址,数组范围并不明确
eg:
int main()
{
int arr[] = { 1,2,3,4,5 };
for (int i : arr)
{
cout << i << " ";
}
cout << endl;
return 0;
}
从这么几点可以看出,c++很多地方是在为c语言填坑,但是c++语法又兼容c语法,只不过一些地方做出了优化,在了解到这几点之后应该就可以比较轻松的入门c++了,如果你认为还需要什么必备知识点,可以在评论区写出来,大家一起讨论哦!